0

抱歉这个问题的标题,我不知道如何为这个问题措辞。

我有一个看起来像这样的表:

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中都有cat_id' 的 ',但如果我这样做了

->where_in('cat_id', $cats1)->where_in('cat_id', $cats2)

显然这是行不通的,因为没有一行cat_id与它相关联。在这种情况下,entry_idI would want back 是1,因为它包含来自 first 的一个值array(23),以及来自 second的一个值array(34)

我不能使用or_where,因为结果不准确。我可以使用直接的 SQL 选择语句,但我想知道是否有办法在这样的表上实现这种类型的查询。我不是 SQL 专业人士,因此不胜感激。

我目前使用另一种解决方案让它工作,我entry_id从第一个获得 's where_in,然后让另一个查询执行where_inthose id's 和where_in第二个猫数组,但我更愿意一次完成整个查询。

这是在 PHP 中。

4

1 回答 1

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)
      ) ;
于 2012-07-07T13:27:11.103 回答