2013-10-15 3 views
0

J'ai 3 tables:requête SQL - JOIN sur toutes les lignes d'une précédente rejoindre

  1. pages (id, nom, desc)
  2. page_tags (id, page_id, tag_id)
  3. tag_posts (tag_id, post_id)

Compte tenu d'une page dans le tableau des pages, je veux obtenir des postes dans la table où tag_posts correspond tag_id ALL tag_ids pour la page indiquée dans la table page_tags.

Par exemple, si les entrées dans les 3 tables sont:

1) pages: [ 'page 1' 1, 'une certaine desc']

2) page_tags:

  1. [1, 1, 1],
  2. [2, 1, 2]

3) tag_posts:

  1. [1, 101],
  2. [2, 102],
  3. [1, 201],
  4. [3, 202]

j'ai fait simple jointure interne des 3 tables utilisant cette requête:

SELECT tp.* 
FROM pages p 
JOIN page_tags pt ON pt.page_id = p.id 
JOIN tag_posts tp ON tp.tag_id = pt.tag_id 
WHERE 1 

Cependant, cela renvoie les lignes 1, 2 et 3 de la table échantillons de tag_posts ci-dessus alors que je voulais que les lignes 1 et 2 comme ces deux lignes correspondent ALL les lignes tag_id de la première jointure entre les pages et la table page_tags.

S'il vous plaît laissez-moi savoir comment je peux y parvenir. Note: J'utilise mysql.

Répondre

1

Je suis confus. La table tag_post a 3 correspondances (ligne 1 2 et 3) car tag_post où tag_id = 1 est apparié deux fois. Donc, je dirais que c'est correct dans ce que vous voyez.

Si vous essayez de trouver les tag_posts pour une page spécifiée, la requête sera ... ce

SELECT tp.* 
FROM pages p 
JOIN page_tags pt ON pt.page_id = p.id 
JOIN tag_posts tp ON tp.tag_id = pt.tag_id 
WHERE p.id = 1 
+0

Ma première jointure est entre les pages et page_tags et il me donne tous les tags pour une page donnée. Je veux que la deuxième jointure me donne des posts qui correspondent à tous les tags de la première jointure. J'espère avoir exprimé clairement mes exigences. – Rainbard

+0

Votre inscription est correcte.Dans votre exemple ci-dessus, la page 1 est référencée deux fois dans la table page_tags. En anglais, la page 1 contient des tags avec les identifiants 1 et 2. Ces tags sont référencés 3 fois dans la table tag_posts. Dans la table tag_posts, les étiquettes de référence 1 et 3 des lignes 1 et 3 et 2 désignent la balise 2. C'est pourquoi vous obtenez 3 balises pour les balises 1 et 2. Faites-moi savoir si j'interprète mal vos tables. –