php - Active Record 或 SQL 中的多个Where In

标签 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]

我需要取回两个数组中都有 cat_identry_id,但如果我这样做

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

显然这不起作用,因为没有行有多个与其关联的cat_id。在本例中,我想要返回的 entry_id 将为 1,因为它也包含来自第一个 array(23) 的值作为第二个数组(34)中的一个。

我无法使用or_where,因为结果不准确。我可以使用直接的 SQL select 语句,但我想知道是否有一种方法可以在这样的表上实现这种类型的查询。我不是 SQL 专家,因此我们将不胜感激。

我目前已经使用另一个解决方案使其工作,其中我从第一个 where_in 获取 entry_id,然后让另一个查询执行 where_in 那些 idwhere_in 第二个猫数组,但我更喜欢一次性完成整个查询。

这是 PHP 语言。

最佳答案

(更新,更正:)需要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)
      ) ;

关于php - Active Record 或 SQL 中的多个Where In,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11375355/

相关文章:

php - 如何在 CakePHP 3.x 中的 MySQL IN 子句中使用多个列?

php - WordPress the_content 不适用于自定义帖子类型

php - 如何在 php shell 脚本中使用参数和选项

mysql - 如何在表中仅插入编辑后的值

mysql - 为什么 Django 时区设置会影响纪元时间?

mysql - Rails Active Record 组或忽略查询中的重复结果

ruby-on-rails - 通过多个关联模型进行单个 ActiveRecord 查询

mysql - 如何通过在 rails 中递增来保存唯一的字符串?

php - 这个 MySQL 查询与 Laravel 查询生成器的等效项是什么?

c# - 如何在开发Web应用程序和桌面应用程序之间做出决定