PHP, besoin d'un petit cout de pouce

Statut
N'est pas ouverte pour d'autres réponses.

DeScH

AstaLaVista
Hello

Bon je vous explique la situation: je dispose d'une table jeux et d'une table news.

La table news comprend un champ jeu qui reprend le numéro de l'id du jeu dans la table jeux.

donc on a par exemple

"titre" "id_du_jeu"
"Dernières news nfs" "1".

Je fais une boucle while qui liste les 20 dernières news. Je voudrais qu'il affiche le nom du jeu qui correspond à la news.

J'ai une méthode qui exécute la requete dans la boucle, mais vu qu'il y a 20 news, ca fait 20 requetes, donc vmt trop.

Comment pourrais-je faire pour ne faire qu'une seule requete qui liste les jeux et qui remplace le numéro du jeu par le nom de celui ci?

J'espère que vous m'avez compris lol
 

zoheir

cvm.mangaleet()
une jointure :-D

Donne les détails des tables !
 

Jereck

Α & Ω
Staff
Table "news" : titre, id_du_jeu
Table "jeux" : nom_jeu, id

SELECT titre, nom_jeu
FROM news JOIN jeux ON id_du_jeu = id

ou alors, si ça marche pas (je sais plus si MySQL accepte les jointures)

SELECT titre, nom_jeu
FROM news, jeux
WHERE id_du_jeu = id
 
1er
OP
DeScH

DeScH

AstaLaVista
TABLE jeux

id - nom

1 - nfs carbon
2- nfs mw

TABLE news

titre - contenu - ... - id_jeu

news 1 nfs carbon - ... - 1
news 1 nfs mw - ... - 2

...

Oui mais avec la jointure ca récupère la news qui correspond au jeu, mais moi je veux que toutes les news soient affichées avec le nom du jeu concerné.
 

Jereck

Α & Ω
Staff
DeScH a dit:
Oui mais avec la jointure ca récupère la news qui correspond au jeu,
Ça dépends de ta clause WHERE ça
 

Soulsight

Elite
Jereck a dit:
Ça dépends de ta clause WHERE ça
euh ?? :roll:

SELECT titre_news, id_jeu, jeu.titre_jeu
FROM news
LEFT JOIN jeu ON news.id_jeu = jeu.id_jeu
ORDER by date DESC
LIMIT 20

en supposant que :

- titre_news = nom du champ du titre de la news de la table news
- titre_jeu = nom du champ du nom du jeu de la table jeu

;)
 
1er
OP
DeScH

DeScH

AstaLaVista
ah oki merci, je ne connaissais pas les left join, seulement les inner join. Je vais essayer ca.
 

Xou

I ♥ rien
Les LEFT ou INNER JOIN fonctionnent sur le même principe en fait.

Par contre, je ne me souviens plus vraiment de la différence.
 
S

Shrekju

ex membre
.Xyo a dit:
Les LEFT ou INNER JOIN fonctionnent sur le même principe en fait.

Par contre, je ne me souviens plus vraiment de la différence.
Le principe est le meme dans le sens ou on parle d'un type de jointure dans les 2 cas. Ca s'arrete là. Documentation.

Remarque, on peut obtenir l'equivalent d'une jointure interne avec une jointure externe mais pas le contraire. (En tout cas, sans autre criteres/operateurs et avec n'importe quels records).
 

guslinux

Gamerz'ien
.Xyo a dit:
Les LEFT ou INNER JOIN fonctionnent sur le même principe en fait.

Par contre, je ne me souviens plus vraiment de la différence.
INNER JOIN : Si le premier élément n'est lié à rien du tout, il n'apparait pas dans la liste.

LEFT JOIN : Si le premier élément n'est lié à rien, il apprait dans la réponse mais les champs du 2e élément sont mis à NULL.
 

Ahava

Revenant
C'est pas du PHP mais du SQL (juste pour faire le gros lourd :cool:)
 

Jereck

Α & Ω
Staff
Ahava a dit:
C'est pas du PHP mais du SQL (juste pour faire le gros lourd :cool:)
Ça dépends, ça aurait pu aussi être un problème d'algorithme :

- Récupérer la liste de jeux complète (couple nom/id)
- Stocker la liste en mémoire (table hashée ou autre, qui associe "nom" à la clé "id")
- Boucle de lecture des news
- pour chaque news : lecture "titre - contenu - ... - id_jeu"
- pour chaque news : association de id_jeu au contenu de la table (étape 2) id_jeu = id (clé de la table etape 2)
- fin de la boucle
 

Ahava

Revenant
Jereck a dit:
Ça dépends, ça aurait pu aussi être un problème d'algorithme :

- Récupérer la liste de jeux complète (couple nom/id)
- Stocker la liste en mémoire (table hashée ou autre, qui associe "nom" à la clé "id")
- Boucle de lecture des news
- pour chaque news : lecture "titre - contenu - ... - id_jeu"
- pour chaque news : association de id_jeu au contenu de la table (étape 2) id_jeu = id (clé de la table etape 2)
- fin de la boucle

:D :D :D :D :D :D :D :D :D

C'est bien pour ne pas a avoir taper tout ca comme code que le SQL a été inventé :D
 

Jereck

Α & Ω
Staff
entre "faire faire 20 jointures à MySQL" et "faire 21 requètes SELECT simples + tableau en mémoire"

je sais pas qui l'emporte....
 

guslinux

Gamerz'ien
Jereck a dit:
entre "faire faire 20 jointures à MySQL" et "faire 21 requètes SELECT simples + tableau en mémoire"

je sais pas qui l'emporte....
Ici l'idée c'est de dire au lieu de faire 20 requetes similaires, on en fait une qui ramène 20 lignes :-D. Donc rien avoir avec 20 jointures :-9
 

Jereck

Α & Ω
Staff
Ha wais, juste, je me souvenais qu'il avait un truc avec un boucle à 20 itérations, mais je me souvenais plus exactement ...

Mais dans le cas de MySQL la question "entre un requète avec une jointure et deux requètes SELECT ..." peut se poser...
:mrgreen:
 

Xou

I ♥ rien
guslinux a dit:
INNER JOIN : Si le premier élément n'est lié à rien du tout, il n'apparait pas dans la liste.

LEFT JOIN : Si le premier élément n'est lié à rien, il apprait dans la réponse mais les champs du 2e élément sont mis à NULL.
J'étais plus sûr de la différence, merci pour ce rappel :p
 

Soulsight

Elite
Jereck a dit:
Ha wais, juste, je me souvenais qu'il avait un truc avec un boucle à 20 itérations, mais je me souvenais plus exactement ...

Mais dans le cas de MySQL la question "entre un requète avec une jointure et deux requètes SELECT ..." peut se poser...
:mrgreen:
hmm, j'apparenterai à l'exemple concret de :

- ouvrir une porte fermée à clée avec la bonne clé
- crocheter avec 2 épingles à suretés .

les jointure ont été faite pour ce genre de problème donc autant utiliser l'outil qui sert à ca et non les outils de sélection ;)
 
W

whatever42

ex membre
\o/ je vais encore pouvoir faire mon gros lourd,
alors ... en Ruby on Rails ...

Code:
@news = News.find(:all, :limit => 20, :order => 'date DESC')
et pour ceux qui sont vraiment fans des jointures il y a le paramètre
Code:
:include => { :news, :titre }
qui va faire la jointure en utilisant la colonne titre_id de news et la table titre, mais si les modèles sont définis un peu correctement, il fait la jointure tout seul
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut