JeuWeb - Crée ton jeu par navigateur
[Resolu] SQL: SELECT sur entrée inexistante - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Resolu] SQL: SELECT sur entrée inexistante (/showthread.php?tid=6650)



[Resolu] SQL: SELECT sur entrée inexistante - zneman - 17-02-2013

Bien le bonsoir !
Me revoilà avec mes petits problèmes de requêtes sur des entrée BDD qui n'existent (peut être) PAS !

Vous vous souvenez de mon précédent topic sur le "comment faire un INSERT quand on ne trouve pas de ligne à UPDATE) ?
http://www.jeuweb.org/showthread.php?tid=9099

Aujourd'hui le problème est: Comment faire une recherche sur une entrée qui n'existe peut être pas !

Imaginons que dans ma BDD, le joueur possède les paysans de type 1 (paysans1) et de type 2 (paysans2), et que j'ai besoin de rechercher tous les paysans qu'il possède ! A savoir: paysans1, paysans2, paysans3 et paysans4 !
Sauf que là, et bien il n'en possède que 2 sur les 4 types ! Deux entrées dans la BDD qui sont inexistantes donc.

Une requête qui ne va donc chercher (en plus d'autres choses) les deux premiers types de paysans: fonctionne donc:
SELECT j.galds, b.nombre AS maisons, t.nombre AS paysans1, t2.nombre AS paysans2
FROM t_joueur AS j
LEFT JOIN t_batiment AS b
ON j.PK_joueur = b.FK_joueur
LEFT JOIN t_troupe AS t
ON j.PK_joueur = t.FK_joueur
LEFT JOIN t_troupe AS t2
ON j.PK_joueur = t2.FK_joueur
WHERE j.PK_joueur = 9 AND b.FK_cBatiment = 2 AND t.FK_cTroupe = 1 AND t2.FK_cTroupe = 2

Mais une requête qui va chercher tous les types:

SELECT j.galds, b.nombre AS maisons, t.nombre AS paysans1, t2.nombre AS paysans2, t3.nombre AS paysans3, t4.nombre AS paysans4
FROM t_joueur AS j
LEFT JOIN t_batiment AS b
ON j.PK_joueur = b.FK_joueur
LEFT JOIN t_troupe AS t
ON j.PK_joueur = t.FK_joueur
LEFT JOIN t_troupe AS t2
ON j.PK_joueur = t2.FK_joueur
LEFT JOIN t_troupe AS t3
ON j.PK_joueur = t3.FK_joueur
LEFT JOIN t_troupe AS t4
ON j.PK_joueur = t4.FK_joueur
WHERE j.PK_joueur = 9 AND b.FK_cBatiment = 2 AND t.FK_cTroupe = 1 AND t2.FK_cTroupe = 2 AND t3.FK_cTroupe = 3 AND t4.FK_cTroupe = 4

Ne fonctionne pas !

Citation :MySQL a retourné un résultat vide (aucune ligne).

Ce que je cherche donc à faire, c'est que cela fonctionne (sans blague Tongue ). Si possible, en remplaçant donc les données de "paysans3" et "paysans4" par "0" vu qu'il n'y en a pas !

Bref, je me casse la tête depuis quelques heures là dessus et aucun de mes amis (y compris google) n'a réussi à me donner une réponse...

Merci donc d'avance si vous connaissez cette dernière ! Smile


RE: SQL: SELECT sur entrée inexistante - Ter Rowan - 17-02-2013

Aucun left join a faire

Un IN a utiliser

Par contre faudrait revoir completement tes notions de sql


RE: SQL: SELECT sur entrée inexistante - Sephi-Chan - 17-02-2013

Il faudrait que tu nous décrives tes tables.


RE: SQL: SELECT sur entrée inexistante - zneman - 17-02-2013

Rowan: Tant que cela ? Cela fait deux années que je n'ai pas codé, la reprise n'est pas facile ! ^^
Sephi:

t_joueur: contient l'id du joueur (PK_joueur) ainsi que des infos comme les galds etc...
t_batiment: contient les bâtiments des joueurs: PK_batiment / FK_joueur / FK_cBatiment (qui est le type du bâtiment) / nombre (contient le nombre de bâtiments que possède le joueur s'il peut en avoir plusieurs)
t_troupe: contient les troupes des joueurs: PK_troupe / FK_joueur / FK_cTroupe (qui est le type de la troupe) / nombre (comme ci-dessus) / type (0,1) si la troupe est en attaque ou non

En gros:

t_joueur:
PK_joueur | galds | ...
----9-----| 10 000 |

t_batiment:
PK_batiment | FK_joueur | FK_cBatiment | nombre
-----1------|----9------|------2-------|--10----

t_troupe:
PK_troupe | FK_joueur | FK_cTroupe | nombre
-----1----|----9------|-----1------|---10---
-----2----|----9------|-----2------|---55---

On peut donc voir ici que je n'ai que la troupe de type 1 et de type 2 dans ma table t_troupe.
Pour que ma requète avec paysans1, paysans2, paysans3, paysans4 fonctionne il aurait fallu que j'ai:


t_troupe:
PK_troupe | FK_joueur | FK_cTroupe | nombre
-----1----|----9------|-----1------|---10---
-----2----|----9------|-----2------|---55---
-----3----|----9------|-----3------|---5----
-----3----|----9------|-----4------|---30---

Je ne sais pas si j'explique bien mon problème ! Confused

Edit: trouvé (si ça peut aider du monde)

Code :
SELECT j.galds, b.nombre AS maisons, COALESCE(t.nombre, 0 ) AS paysans1, COALESCE(t2.nombre, 0 ) AS paysans2, COALESCE(t3.nombre, 0 ) AS paysans3, COALESCE(t4.nombre, 0 ) AS paysans4
FROM t_joueur AS j
LEFT JOIN t_batiment AS b ON j.PK_joueur = b.FK_joueur
LEFT OUTER JOIN t_troupe AS t ON j.PK_joueur = t.FK_joueur
AND t.FK_cTroupe =1
LEFT OUTER JOIN t_troupe AS t2 ON j.PK_joueur = t2.FK_joueur
AND t2.FK_cTroupe =2
LEFT OUTER JOIN t_troupe AS t3 ON j.PK_joueur = t3.FK_joueur
AND t3.FK_cTroupe =3
LEFT OUTER JOIN t_troupe AS t4 ON j.PK_joueur = t4.FK_joueur
AND t4.FK_cTroupe =4
WHERE j.PK_joueur =9
AND b.FK_cBatiment =2



RE: [Resolu] SQL: SELECT sur entrée inexistante - Ter Rowan - 17-02-2013

Meme sans le in ca le fait en fait

Tu ne dois pas ramener tes paysans en colonne mais en ligne

Et coté php, tu fetch tes résultats