Php Mysql IN子句中包含类似于nothave的内容

Php Mysql IN子句中包含类似于nothave的内容,php,mysql,ruby-on-rails,database,Php,Mysql,Ruby On Rails,Database,我已经尝试了一个星期,我无法实现这一点。我尝试了很多方法,但没有找到任何解决方案。 我将在下面解释这一点: 选项表: +---------+-----------+------------+ | id | name | major | +---------+-----------+------------+ | 1 | option 1 | 1 | | 2 | option 2 | 1 | | 3

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

选项表:

+---------+-----------+------------+
|   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   |
+---------+-----------+
项目\u选项

+---------+-----------+
| 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      |
+---------+-----------+
因此,如果我在(1,3)和
options.major=1中选择
items\u options.option\u id,
我得到:

但我应该得到以下信息:

+---------+----------+
| 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个主要选项,所以我也尝试使用下面的选项。
末尾有计数(不同的项目\u选项。选项\u id)=2

编辑1:

sqlfiddle:

您需要将(1,3)
中的
选项id时的
计数(不同选项id)
不同选项id的总数进行比较,并按
主要=1
进行过滤

一种方法是将
COUNT
CASE
一起使用:

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)

您可以设置sqlfiddle吗?当然,给我一分钟的sqlfiddle,请检查@JayBlanchardHow是
选项。major
与任何其他表相关?
选项。major
是一种状态,用于显示其他选项中的major。不工作,我尝试了
1,2,3
,我应该只得到第2项,但我得到了所有3项。是的,我实际上已经尝试过了,我被击中的部分是,
1,2,3
应该只显示
项目2
,而不是
项目1
项目2
。如果
项目1
有更多的
主要
选项,这些选项不应出现在结果mm中,则没有its仍然同时显示
项目1
项目2
。我甚至不想和伯爵一起尝试。我甚至可以尝试类似的东西
有1,2但没有3
有1,3但没有2
等等。@praveenkumar--为什么不返回项目1?项目1有专业1、2和3,没有其他专业。我错过什么了吗?
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)