按多个值过滤一对多关系

时间:2014-02-03 15:54:32

标签: php mysql sql

这必须是一个普通的事情,但我没有运气谷歌搜索。

我有一个类别表:

Table A
catid | text
1     | Category A
2     | Category B
3     | Category C

然后将此表连接到一张地图,该地图可以跟踪照片所在的类别

Table B
catid | photoid
1     | 1
2     | 1
1     | 2
3     | 3

我需要做的是过滤查询,以便仅返回选择的每个类别中的照片。例如:

  1. 如果用户选择类别A和B,则返回照片1。
  2. 如果用户仅选择类别A,则返回照片1和2.
  3. 如果用户选择类别A,B和C - 我什么都不返回。
  4. 感谢您提供任何帮助。

    -Matt

3 个答案:

答案 0 :(得分:1)

最简单的方法之一是:

SELECT 
    * 
FROM 
    B 
WHERE 
    B.catid IN (1, 2) 
GROUP BY 
    B.photoid 
HAVING 
    COUNT(B.photoid) = 2

要匹配3个类别:

SELECT 
    * 
FROM 
    B 
WHERE 
    B.catid IN (1, 2, 3) 
GROUP BY 
    B.photoid 
HAVING 
    COUNT(B.photoid) = 3

您也可以多次加入同一个表。或者做一个子查询。我会测试几种不同的方法来查看哪种方法对数据集的执行速度最快。

答案 1 :(得分:0)

使用不存在子查询

Select distinct photoid
From photoCategory pc
Where Not Exists 
    (Select * From category c
     Where catId <> pc.catId)

答案 2 :(得分:-1)

答案在这里......

https://stackoverflow.com/a/17026879/520857

对不起刚才的误导性回答

顺便说一句,你要做的事情被称为INTERSECT,MySQL本身并不支持链接中的奇怪解决方案。