2009-08-12 7 views
0

Je dois être honnête et vous dire que je ne suis pas bon dans les requêtes de base de données et cette question est probablement assez simple.Instruction SQL avec plusieurs jointures

J'ai trois tables

Post 
    ID 
    entry 
Category 
    ID 
    name 
CategoryBinding 
    ID 
    postID 
    categoryID 

Ma requête normale est d'obtenir tous les messages avec les catégories, il est mis en

SELECT * FROM `Post` AS `p` 
LEFT JOIN `CategoryBinding` AS `cb` ON p.ID = cb.postID 
LEFT JOIN `Category` AS `c` ON cb.categoryID = c.ID 

La requête renvoyée en est quelque chose comme:

ID entry ID name ID postID categoryID 
1  entry1 1  php  1  1   1 
1  entry1 2  asp  1  1   2 

2  entry2 1  php  1  2   1 

3  entry3 null null null null  null 

Maintenant, je veux obtenir tous les messages qui appartiennent à un certain ID de catégorie avec toutes les catégories Le post est mis en.
I.E Je veux obtenir les mêmes choses que dans la première requête MAIS seulement les messages qui appartiennent à une certaine catégorie. Maintenant, je veux seulement obtenir les messages qui appartiennent à la catégorie asp. C'est

ID entry ID name ID postID categoryID 
1  entry1 1  php  1  1   1 
1  entry1 2  asp  1  1   2 

Savez-vous comment je peux faire cela?

Je serai très reconnaissant si quelqu'un m'aide puisque c'est plus comme une question "Faites le travail pour moi".

Répondre

3
SELECT * 
FROM `Post` AS `p` 
LEFT JOIN `CategoryBinding` AS `cb` ON p.ID = cb.postID 
LEFT JOIN `Category` AS `c` ON cb.categoryID = c.ID 
INNER JOIN `Post` AS `p2` ON p.id = p2.id 
WHERE p.id in 
(
    SELECT p2.id 
    FROM `Post` as `p2` 
    LEFT JOIN `CategoryBinding` AS `cb` ON p2.ID = cb.postID 
    LEFT JOIN `Category` AS `c` ON cb.categoryID = c.ID 
    WHERE c.id = @SomeCategory 
) 

D'accord, coup final.

Cela retournera les lignes en double, il suffit d'ajouter un groupe à ce que vous voulez.

+0

J'ai changé ma question et ajouté la sortie attendue. – unkownt

+0

La requête que vous avez écrit ne me donnera que 1 entry1 2 asp 1 1 2 – unkownt

+0

D'accord, j'ai mis à jour la requête. Donne un coup de feu à celui-ci. – Brandon

Questions connexes