2010-09-27 5 views
1

je le tableau MySql suivant:Déclaration SQL (JOIN)

-------------------------------------------- 
Table 'category' 
-------------------------------------------- 
category_id name  parent_id 
1    animal  NULL 
2    vegetable NULL 
3    mineral  NULL 
4    dog   1 
6    cat   1 
7    carrot  2 
8    quartz  3 

L'instruction SQL répertorie tous les résultats comme celui-ci:


category_id category sub_category 
4    animal  dog 
6    animal  cat 
7    vegetable carrot 
8    mineral  quartz 

SELECT sub_category.category_id AS category_id, 
     category.name AS category, 
     sub_category.name AS sub_category 
FROM category 
LEFT OUTER JOIN category AS sub_category 
    ON sub_category.parent_id = category.category_id 
WHERE category.parent_id IS NULL 
ORDER BY category_id 

Mais maintenant, j'ai une autre table catégories pour lesquelles les utilisateurs particuliers ne sont pas intéressés:

-------------------------------------------- 
Table 'category_filter' 
-------------------------------------------- 
user_id category_id 
1   4 
1   7 
1   8 

Comment puis-je faire une requête pour un utilisateur particulier afin que j'obtienne une liste de toutes les catégories avec une information si un utilisateur est intéressé ou pas?

Quelque chose comme ceci par exemple:

-------------------------------------------------------------- 
category_id category sub_category interested 
4    animal  dog    NULL 
6    animal  cat    6 
7    vegetable carrot   7 
8    mineral  quartz   NULL 

Merci d'avance pour votre soutien.

Répondre

0

Utilisation:

SELECT c.category_id, 
      c.name AS category, 
      subc.name AS sub_category, 
      cf.category_id AS interested 
    FROM CATEGORY c 
LEFT JOIN CATEGORY subc ON subc.category_id = c.parent_id 
         AND subc.parent_id IS NULL 
LEFT JOIN CATEGORY_FILTER cf ON cf.category_id IN (c.category_id, subc.category_id) 
          AND cf.user_id = ? 
    WHERE c.parent_id IS NOT NULL 

La jonction à CATEGORY_FILTER est différente de la réponse de @ djacobson, en ce qu'elle se joint à la table pour les deux instances de la table CATEGORY.

+0

Malheureusement, celui-ci obtient une liste des catégories parentes (animal, légume, minéral) au lieu des sous-catégories. –

+0

@Mark Fischer: J'ai manqué un critère de jointure sur les sous-catégories pour m'assurer que les parents ne sont pas inclus, mais la requête renverrait des sous-catégories. Veuillez réessayer avec l'instruction mise à jour. –

+0

Malheureusement toujours les mêmes résultats (seulement les catégories parentes). –

0

On dirait que vous avez juste besoin d'ajouter une autre jointure à la requête pour inclure le filtre:

SELECT sub_category.category_id AS category_id, 
     category.name AS category, 
     sub_category.name AS sub_category, 
     filter.category_id AS interested 
FROM category 
LEFT OUTER JOIN category AS sub_category 
    ON sub_category.parent_id = category.category_id 
LEFT OUTER JOIN (SELECT * FROM category_filter WHERE user_id = @UserID) filter ON category.category_id = filter.category_id 
WHERE category.parent_id IS NULL 
ORDER BY category.category_id 

Cela ne tirez les informations « d'intérêt » pour l'utilisateur donné, se joindre à l'ensemble de toutes les catégories .

+0

Malheureusement, cette déclaration ne donne aucun résultat. Ce que je cherche, c'est que toutes les catégories sont listées mais qu'il y a une colonne supplémentaire où je peux voir si l'utilisateur est intéressé ou pas. –

+0

hmm, celui-ci obtient: Colonne inconnue 'category_filter.category_id' dans 'liste des champs' –

+0

@Mark Fischer: J'ai corrigé l'erreur de colonne inconnue, n'utilisait pas l'alias de la table. –