TourDeJeu, le réseau des jeux en ligne alternatifs : jeux web multijoueurs, jeux par forum. En savoir +

Flux RSS des discussions du forum : pour les joueurs, et pour les créateurs et MJ
  Reply to this topicStart new topicStart Poll

> Petite Enigme Mysql, ... où tester l'inexistence dans une tbl
Sinclair
  Ecrit le : Mardi 14 Décembre 2004 à 23h26
Quote Post


Pro
*

Groupe : Membre
Messages : 133


Salut !

C'est un petit soucis que je contourne avec une astuce mais qui montre ses limites.

Pour l'exemple, nous avons une table de noms :
TBL_NOM (id_nom, nom)

et une table de personnages :
TBL_PERSO (id_perso, id_partie, id_nom)


Le problème commence pour selectionner un nom qui n'est pas déja utilisé par un personnage.
Comme NOT IN et EXCEPT ne sont pas permis (si j'ai bien compris), ca pause probleme.

Le truc consiste à écrire :
SELECT nom FROM tbl_nom
LEFT JOIN tbl_perso ON tbl_nom.id_nom=tbl_perso.id_nom
WHERE id_perso IS NULL

Jusqu'a maintenant, cette astuce me permettait de contourner le problème.
Mais maintenant, je cherche un nom qui n'est pas utilisé dans la partie 1(id_partie=1) et là, mon truc ne marche plus sad.gif

Est-ce que quelqu'un s'est confronté au même problème ?


--------------------
Concepteur/Développeur de guildes.jpc.free.fr
PM
Top
Sybler
Ecrit le : Mercredi 15 Décembre 2004 à 02h37
Quote Post


Ouf
*

Groupe : Membre
Messages : 453


Personnellement, j'utilise cette facon pour m'assurrer disons qu'un nom de personnage n'est pas déjà présent:

$new_perso = "brun";
TBL_USER (id, nom)
TBL_PERSO (id, partie, nom)



$query = "SELECT count(nom) FROM tbl_perso WHERE nom='$new_perso';";
$result = mysql_query($query);
$row = mysql_fetch_row($result);

if ($row[0] == 0) {
die("perso déjà utilisé");
}


- ou -


$query = "SELECT id FROM tbl_perso WHERE nom='$new_perso';";
$result = mysql_query($query);

if (@mysql_num_rows($result)==1) {
die("perso déjà utilisé");
}




Voilà, je sais que je répond pas directement à ta question, mais j'espere que ses solution aiderons quelques personnes... et peut etre meme que j'apprendrais comment faire encore mieux smile.gif


--------------------
user posted image
PMEmail PosterUsers Website
Top
gorgu
Ecrit le : Mercredi 15 Décembre 2004 à 04h28
Quote Post


Ouf
*

Groupe : Membre
Messages : 417


$query = "SELECT count(nom) FROM tbl_perso WHERE nom='$new_perso';";
$result = mysql_query($query);
$row = mysql_fetch_row($result);

if ($row[0] > 0) {


die("perso déjà utilisé");
}

et pas == tongue.gif

et penser a faire une déconnection base de données avant le die smile.gif


--------------------
enfin je crois ...
Adept JDR
PMEmail PosterUsers Website
Top
Haiken
Ecrit le : Mercredi 15 Décembre 2004 à 12h37
Quote Post


Ouf
*

Groupe : Membre
Messages : 360


Je propose :

SELECT nom FROM tbl_nom
LEFT JOIN tbl_perso ON tbl_nom.id_nom=tbl_perso.id_nom and tbl_perso.id_partie=1
WHERE id_perso IS NULL

PS : les subselects (IN, NOT IN, ANY...) sont supportés depuis MySQL 4.1 qui est passé en version stable depuis peu, et qui va donc se généraliser chez tous les hébergeurs


--------------------
PMEmail Poster
Top
Guest
Ecrit le : Mercredi 15 Décembre 2004 à 16h03
Quote Post


Unregistered






QUOTE
PS : les subselects (IN, NOT IN, ANY...) sont supportés depuis MySQL 4.1 qui est passé en version stable depuis peu, et qui va donc se généraliser chez tous les hébergeurs

En v'la une bonne nouvelle !
Pas que ça serve tous les jours, mais c'est tout de meme utile de pouvoir faire des selects imbriqués !
Top
Nonothehobbit
Ecrit le : Mercredi 15 Décembre 2004 à 17h15
Quote Post


Alien
*

Groupe : Moderateurs
Messages : 1298


Faîtes quand même des tests de performance avant de vous réjouir. C'est pas forcément la meilleure solution. smile.gif


--------------------
user posted image
PMEmail PosterUsers Website
Top
gladiator
Ecrit le : Mercredi 15 Décembre 2004 à 18h00
Quote Post


Pro
*

Groupe : Membre
Messages : 124


Tu as d'autre solution a nous proposer ?


--------------------
Futur Webmaster de : Fantastic Adventure
Toujours en creation pour une periode de quelques semaines ...

Les idees ont ete concue et faites , les regles ont ete preparer , juste maintenant le codage qui sera un peu plus long que prevue ...
PMEmail Poster
Top
Grouik
Ecrit le : Mercredi 15 Décembre 2004 à 22h18
Quote Post


Unregistered






Et simplement (non testé) :

SELECT COUNT(*)
FROM TBL_NOM N, TBL_PERSO P
WHERE N.nom = '$nom'
AND N.id_nom = P.id_nom
AND P.id_partie = $partie

Le résultat = le nombre de fois ou un $nom et utilisé dans une $partie.

Sinon même remarque que Nonothehobbit pour l'utilisation de [NOT] IN ou ANY...
Top
Sinclair
Ecrit le : Jeudi 16 Décembre 2004 à 11h40
Quote Post


Pro
*

Groupe : Membre
Messages : 133


QUOTE (Haiken @ 15 Dec 2004, 12:37 )
PS : les subselects (IN, NOT IN, ANY...) sont supportés depuis MySQL 4.1 qui est passé en version stable depuis peu, et qui va donc se généraliser chez tous les hébergeurs

Cool !

Mais après un phpinfo je vois : Client API version 4.0.22 ... j'ai peur que free ne soit pas encore passé à la 4.1 sad.gif

Bon sinon, je n'ai pas encore testé tout ça ... mais je suis sur que ça va marcher grace à votre aide !

Merci les gars thumbsup.gif


--------------------
Concepteur/Développeur de guildes.jpc.free.fr
PM
Top
askywhale
Ecrit le : Jeudi 16 Décembre 2004 à 14h49
Quote Post


Pro
*

Groupe : Membre
Messages : 170


théoriquement on fait tout avec des bonnes vieilles jointures laugh.gif . Et ça marche sur tout les mysql.


--------------------
PMEmail Poster
Top
Sinclair
Ecrit le : Jeudi 16 Décembre 2004 à 20h01
Quote Post


Pro
*

Groupe : Membre
Messages : 133


QUOTE (Haiken @ 15 Dec 2004, 12:37 )
Je propose :

SELECT nom FROM tbl_nom
LEFT JOIN tbl_perso ON tbl_nom.id_nom=tbl_perso.id_nom and tbl_perso.id_partie=1
WHERE id_perso IS NULL
ok nikel, ça marche !

Merci Haiken ! ... et aussi les autes pour m'avoir aidé !

.. je retourne dans mon code cool.gif


--------------------
Concepteur/Développeur de guildes.jpc.free.fr
PM
Top
« Sujets + anciens | Programmer | Sujets + récents »

Reply to this topicStart new topicStart Poll