【问题标题】:Mysql IN clause with something like not HAVINGMysql IN 子句类似于 not HAVING
【发布时间】:2014-05-27 16:49:08
【问题描述】:

我从 1 周开始就一直在尝试这个,但我无法实施。我尝试了很多方法,但没有得到任何解决方案。 我将在下面解释这一点:

options table:

+---------+-----------+------------+
|   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     |
+---------+-----------+------------+

items table

+---------+-----------+
|    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  |
+---------+----------+

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

我尝试过的 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 个主要选项,所以我也尝试使用以下选项。 HAVING COUNT(DISTINCT items_options.option_id) = 2在最后

编辑 1:

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

【问题讨论】:

  • 你能设置一个 sqlfiddle 吗? sqlfiddle.com
  • 好的,请稍等
  • 添加了 sqlfiddle,请查看@JayBlanchard
  • options.major 与其他表有何关联?
  • options.major 是在其他选项中显示主要的状态。

标签: php mysql ruby-on-rails database


【解决方案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)

【讨论】:

  • 不工作,我试过1,2,3,我应该只得到第 2 项,但我得到了所有 3 项。
  • 是的,我实际上已经尝试过了,我感到震惊的是,1,2,3 应该只显示item 2,而不是item 1item 2。其中item 1 有更多major 选项,这些选项不应出现在结果中
  • 嗯,不,它仍然同时显示item 1item 2。我什至不想尝试计数。我什至可以尝试类似的东西。 having 1,2 and not having 3having 1,3 and not having 2 等等。
  • @praveenkumar -- 为什么它不应该返回第 1 项?项目 1 有专业 1、2 和 3,没有其他专业。我错过了什么吗?
猜你喜欢
  • 1970-01-01
  • 2017-01-30
  • 2019-06-24
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
相关资源
最近更新 更多