【发布时间】: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