2011-06-28 37 views
0

我有3个表格。查找多个关系表上的连接记录

  1. 游表(可选)
  2. 旅游标签关联表(optional_tag_rel)
  3. 旅游主题关联表(optional_theme_rel)

漫游可以有多个标签和多个主题。所以我写了什么和sql语句来查找指定的游览。例如找到旅行团,其中标签ID = 10和15的主题ID = 36和45

SELECT DISTINCT (t1.id) FROM optional AS t1 
LEFT JOIN optional_theme_rel as t3 ON t3.tour_id = t1.id AND (t3.theme_id =36 OR t3.theme_id =45) 
LEFT JOIN optional_tag_rel as t2 ON t2.tour_id = t1.id AND (t2.tag_id = 10 OR t2.tag_id =15) 
GROUP BY optional.id 

这些语句获取其主题ID = 36或45的所有记录,但我需要使用AND陈述但是当我使用而不是OR,它不显示记录。在sql上必须有不同的方式,但我不太了解它。

回答

0

如果我理解正确,您希望参观h (theme_id = 36和45)以及两个标签(tag_id = 10和15),那么你既不需要GROUP BY也不需要DISTINCT

但要做到这一点的方法之一是两次加入到次表中的每一个:

SELECT op.id 
FROM optional AS op 

    JOIN optional_theme_rel AS theme1 
    ON theme1.tour_id = op.id 
    AND theme1.theme_id = 36 
    JOIN optional_theme_rel AS theme2 
    ON theme2.tour_id = op.id 
    AND theme2.theme_id = 45 

    JOIN optional_tag_rel AS tag1 
    ON tag1.tour_id = op.id 
    AND tag1.tag_id = 10 
    JOIN optional_tag_rel AS tag2 
    ON tag2.tour_id = op.id 
    AND tag2.tag_id = 15 

另一种方式来获得相同的结果是:

SELECT op.id 
FROM optional AS op 

    JOIN 
    (SELECT tour_id 
     FROM optional_theme_rel 
     WHERE theme_id IN (36, 45) 
     GROUP BY tour_id 
     HAVING COUNT(DISTINCT theme_id) = 2 
    ) AS theme 
    ON theme.tour_id = op.id 

    JOIN 
    (SELECT tour_id 
     FROM optional_tag_rel 
     WHERE tag_id IN (10, 15) 
     GROUP BY tour_id 
     HAVING COUNT(DISTINCT tag_id) = 2 
    ) AS tag 
    ON tag.tour_id = op.id 
+0

这起作用。我一直在寻找这个答案几天。我需要学习mysql语句。再次感谢。 – dorayaki

0
  • 使用IN语法
  • 没有必要为group by(你有没有发挥聚合函数)
  • AS的位置稍微出

试试这个:

SELECT DISTINCT t1.id 
FROM optional t1 
LEFT JOIN optional_theme_rel as t3 ON t3.tour_id = t1.id AND t3.theme_id in (36, 5) 
LEFT JOIN optional_tag_rel as t2 ON t2.tour_id = t1.id AND t2.tag_id in (10, 15) 
+1

感谢 - 增加了它。无论如何,我认为这个答案是错误的 - 取决于问题的要求。目前还不清楚他是否希望两者兼得,或者 – Bohemian

+0

谢谢您的回复,该陈述给我的结果与我的查询相同。我想我最好两次检查我的语法。无论如何,感谢您的帮助。 – dorayaki

相关问题