2010-10-13 4 views
0

ne savez pas comment demander cela il est logique, mais je suis en train de faire une requête comme:MySQL Select: Obtenir le (s) enregistrement (s) principal (s) par plusieurs enregistrements attachés?

SELECT * FROM PAGES OU d'un dossier joint existe dans PAGE_FILTERS et cet enregistrement a une FilterTypeID de 22 et un autre joint enregistrement existe dans PAGE_FILTERS pour la même page ID et cet enregistrement a un identifiant de type de filtre de 27.

J'ai une structure comme ceci:

 
PAGES table 
PageID  PageName 
1   Page 1 
2   Page 2 
3   Page 3 

PAGE_FILTERS table 
PageID  FilterTypeID   FilterValueID 
1     22     1 
1     27     2 
2     22     0 
2     24     1 
3     22     1 
3     27     1 
3     28     2 

Ainsi, compte tenu FilterTypeID de 22 et 27, ma requête devrait return PageID's 1 et 3. Page 2 n'est pas sélectionné depuis 22 matches, mais il n'y a pas d'enregistrement m correspond à FilterTypeID 27.

Page 3 même s'il existe un filtre supplémentaire. En d'autres termes, je sais quels types de filtre une page doit avoir, et je dois obtenir toutes les pages qui ont tous les types requis. Je ne suis pas opposé à changer la structure de la base de données si cela a plus de sens, mais chaque page pourrait avoir aucun, un ou plusieurs ensembles de filtres attachés.

Répondre

0
SELECT p.* 
FROM pages p 
JOIN PAGE_FILTERS pf 
ON p.PageID = pf.PageID 
    AND pf.FilterTypeID IN (22,27) 
GROUP BY p.PageID 
HAVING COUNT(DISTINCT pf.FilterTypeID) = 2 
Questions connexes