Active Record或SQL中的多个位置

时间:2012-07-07 13:21:55

标签: php mysql activerecord

对于问题的标题感到抱歉,我不确定如何为此问题说出来。

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

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。

1 个答案:

答案 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)
      ) ;