2010-11-14 10 views
1

Je suis vraiment désolé pour le premier poste car je n'ai pas tout expliqué.Comment interroger 3 tables dans une seule requête?

Fondamentalement, j'ai 3 tables, une pour les messages, une pour les catégories, & Un autre pour lier les catégories avec les messages.

Je veux dans une requête MySQL unique de sélectionner les publications qui sont sous une catégorie spécifique.

posts(id,title,body) 
--------------------- 
125,Some title,Blah blah 


categories(id,name) 
--------------------- 
1,politic 
2,entertainment 

linker(categoryid,postid) 
--------------------- 
2,125 

Je veux dans une seule requête pour récupérer des messages dans la catégorie de divertissement par exemple, que faire?

Merci

+0

N'avez-vous pas demandé cela avec 2 tables? http://stackoverflow.com/questions/4175544/querying-2-tables-in-a-single-query –

+0

"Je suis vraiment désolé pour le premier message car je n'ai pas tout expliqué." – Ryan

+0

Avez-vous commis une erreur? Que se passe-t-il avec les fonctions trig dans la requête du dernier bloc de code? –

Répondre

3
select 
    p.* 
from 
    posts p 
    inner join linker l on l.postid = p.id 
    inner join categories c on c.categoryid = l.categoryid 
where 
    c.name = 'entertainment' 
+0

Salut, merci pour votre réponse, et si 2 catégories sont assignées à un poste? – Ryan

0

C'est exactement la même chose, il vous suffit de joindre à 3 tables intead de 2:

SELECT P.id post_id, 
     P.title, 
     P.body, 
     C.id category_id, 
     C.name 
FROM posts P 
INNER JOIN linker L 
    ON P.id = L.postid 
INNER JOIN categories C 
    ON L.categoryid = C.id 
WHERE C.name = 'Category' 

Ne pas avoir peur de faire vos propres tests. Si vous comprenez comment joindre deux tables, vous devez comprendre comment joindre trois, quatre et plus.

+0

Salut, merci pour votre réponse, et si 2 catégories sont assignées à un poste? – Ryan

+0

Ensuite, vous auriez deux lignes différentes avec le même post_id mais deux category_id différents. La meilleure façon de savoir est d'essayer! –

0

L'instruction SQL suivante devrait vous fournir une base pour ce que vous essayez de faire.

select p.* 
from posts p 
inner join linker l 
on l.postid = p.id 
inner join categories c 
on l.categoryid = c.id 
where c.name = 'entertainment' 
0

Si un poste appartient à 2 catégories, vous pouvez toujours utiliser la requête de pinkfloydx33 avec DISTINCT dans l'instruction select:

select 
    DISTINCT p.* 
from 
    posts p 
    inner join linker l on l.postid = p.id 
    inner join categories c on c.categoryid = l.categoryid 
where 
    c.name = 'entertainment' 

Le jeu de résultats affichera un seul enregistrement.

+0

Quoi? Absolument pas! DISTINCT supprime les tuples en double, c'est tout, c'est tout. Si les tuples sont (1,1) et (1,2), il n'y a pas de raison de retirer l'un d'entre eux, cela n'a pas de sens. –

+0

David voulait une requête unique qui aboutit à tous les messages d'une catégorie particulière. Si un article appartient à 2 catégories différentes, le résultat affichera deux fois le même article. DISTINCT supprimera le doublon. Si David voulait voir le nom de la catégorie dans le résultat, DISTINCT ne devrait pas figurer dans l'instruction select. –

+0

Je comprends ce que vous essayez de faire, mais cela ne fonctionnera pas à cause du SELECT *. Si un post_id appartient à deux catégories différentes, vous choisirez des tuples comme (1, 'Politic') et (1, 'Entertainment'). (Bien, évidemment, pas avec la clause WHERE, mais vous obtenez le point.) Il ne devrait pas y avoir de doublon, vraiment, à moins qu'il y ait deux lignes identiques dans la table de l'éditeur de liens. –

0

Si vous spécifiez une seule catégorie dans la clause WHERE, le résultat sera une seule ligne pour chaque ID poste.

De toute façon, vous pouvez utiliser DISTINCT ou GROUP BY lorsque le résultat peut être supérieur à une ligne par ID, mais dans ce cas, je préfère le second (GROUP BY).

Questions connexes