php - Mysql IN 子句带有类似 not HAVING 的内容

标签 php mysql ruby-on-rails database

我已经尝试了 1 周,但无法实现。我尝试了很多方法,但没有得到任何解决方案。 我将在下面解释这一点:

选项表:

+---------+-----------+------------+
|   id    |    name   |    major   |
+---------+-----------+------------+
|    1    | option 1  |      1     |
|    2    | option 2  |      1     |
|    3    | option 3  |      1     |
|    4    | option 4  |      0     |
|    5    | option 5  |      0     |
|    6    | option 6  |      0     |
+---------+-----------+------------+

项目表

+---------+-----------+
|    id   |   name    |
+---------+-----------+
|    1    |  item 1   |
|    2    |  item 2   |
|    3    |  item 3   |
+---------+-----------+

items_options

+---------+-----------+
| item_id |option_id  |
+---------+-----------+
|    1    |    1      |
|    1    |    2      |
|    1    |    3      |
|    1    |    4      |
|    1    |    5      |
|    1    |    6      |
|    2    |    1      |
|    2    |    2      |
|    2    |    3      |
|    2    |    6      |
|    3    |    1      |
|    3    |    3      |
|    3    |    5      |
|    3    |    6      |
+---------+-----------+

因此,如果我选择 items_options.option_id IN (1,3)options.major = 1, 我得到:

+---------+----------+
| item_id |   name   |
+---------+----------+
|    1    |  item 1  |
|    2    |  item 2  |
|    3    |  item 3  |
+---------+----------+

但我应该得到以下内容:

+---------+----------+
| item_id |   name   |
+---------+----------+
|    3    |  item 3  |
+---------+----------+

我实际上不需要考虑非主要选项,但是当我选择1,3时,我应该只得到第二个结果,如果它有额外的主要选项,那么它不应该出现在列表中。结果应仅包含确切的选项,而不是更多或更少的选项。

我尝试过的 MySQL 查询:

SELECT items.id,items.name FROM items
INNER JOIN items_options ON items_options.option_id = items.id
INNER JOIN options ON options.id = items_options.option_id
WHERE items_options.option_id IN (1,3) AND options.major = 1
GROUP BY items.id

我只有 3 个主要选项,所以我也尝试使用以下选项。 最后有 COUNT(DISTINCT items_options.option_id) = 2

编辑1:

sqlfiddle: http://sqlfiddle.com/#!2/280bf3/1

最佳答案

您需要将 option_id in (1,3) 时的 count(distinct option_id) 与总体 distinct option_id 的计数进行比较,按major = 1过滤。

实现此目的的一种方法是将 COUNTCASE 结合使用:

SELECT items.id, items.name
FROM items
  INNER JOIN items_options io ON io.item_id = items.id
  INNER JOIN options o ON io.option_id = o.id AND o.major = 1 
GROUP BY items.id
HAVING COUNT(DISTINCT
             CASE WHEN io.option_id IN (1,3)
             THEN io.option_id
             END) = COUNT(DISTINCT io.option_id)

关于php - Mysql IN 子句带有类似 not HAVING 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23894818/

相关文章:

MySQL 为什么在有索引时记录为慢查询/日志查询不使用索引?

ruby-on-rails - 来自 sidekiq 的 Action Cable Broadcast 消息仅在刷新后显示,从控制台立即生效

php - 从sql php中删除动态加载iterm

php - Vim - mysqli 与 phpcomplete 函数

ruby-on-rails - 简单计算会导致Ruby中的语法错误

ruby-on-rails - 语法错误,意外 ')' ,期待 keyword_then 或 ';' 或 '\n'

php - PHP中foreach的计数部分是如何实现的?

php - 如何从 Codeigniter 4 中的 url 中删除 public/index.php/

php - 我可以让 php 在使用 <?= ?> 时自动转义 HTML 字符吗?

php - php 中 sql 编辑之间的平均时间