对于问题的标题感到抱歉,我不确定如何为此问题说出来。
我有一个看起来像这样的表:
entry_id | cat_id
---------+-------
1 | 23
1 | 17
1 | 34
1 | 11
2 | 25
2 | 28
2 | 90
2 | 23
然后我有不同的类别数组
$cats1 = [23, 46, 67]
$cats2 = [34, 28, 91]
我需要找回两个阵列中都有entry_id
的{{1}},但如果我这样做了
cat_id
显然这不起作用,因为没有行与->where_in('cat_id', $cats1)->where_in('cat_id', $cats2)
关联。在这种情况下,我想要的cat_id
将是entry_id
,因为它包含来自第一个1
的值,以及来自第二个array(23)
的值。< / p>
我无法使用array(34)
因为结果不准确。我很好用直接的SQL select语句,但我想知道是否有一种方法让我在这样的表上实现这种类型的查询。我不是SQL专家,所以任何指导都会受到赞赏。
我目前正在使用其他解决方案,我从第一个or_where
获取entry_id
,然后让另一个查询执行where_in
那些where_in
'和id
第二组猫,但我更愿意一次完成整个查询。
这是用PHP。
答案 0 :(得分:1)
(更新,更正:) DISTINCT
是必需的:
SELECT DISTINCT a.entry_id
FROM tableX AS a
JOIN tableX AS b
ON b.entry_id = a.entry_id
WHERE a.cat_id IN (23, 46, 67)
AND b.cat_id IN (34, 28, 91) ;
如果您有entry
表格,您还可以使用JOIN
:
SELECT DISTINCT e.entry_id
FROM entry AS e
JOIN tableX AS a
ON a.entry_id = e.entry_id
JOIN tableX AS b
ON b.entry_id = e.entry_id
WHERE a.cat_id IN (23, 46, 67)
AND b.cat_id IN (34, 28, 91) ;
或EXISTS
个相关子查询:
SELECT e.entry_id
FROM entry AS e
WHERE EXISTS
( SELECT *
FROM tableX AS a
WHERE a.entry_id = e.entry_id
AND a.cat_id IN (23, 46, 67)
)
AND EXISTS
( SELECT *
FROM tableX AS b
WHERE b.entry_id = e.entry_id
AND b.cat_id IN (34, 28, 91)
) ;