选择与所有数组值匹配的结果

时间:2015-04-03 11:55:21

标签: mysql

我现在试图解决这个问题很长一段时间,我似乎无法独自完成。

我想存储链接到ID的OPTIONS,并在需要时获得与所有想要的OPTIONS匹配的结果。我想过这样做:

ID    |    OPTION

aaa   |  1
aaa   |  2
aaa   |  3

bbb   |  1
bbb   |  2

ccc   |  1
ccc   |  2
ccc   |  5
ccc   |  7

ID和OPTION是FOREIGN KEYS。

最终请求看起来像

options_wanted(1,2,5,7)
SELECT * FROM main_table 
WHERE crit1=... 
AND crit2=... 
AND (ALL OPTIONS ARE FOUND IN options TABLE)

我能让它工作还是应该更改实施?

你有什么建议我?

修改
感谢https://stackoverflow.com/a/7505147/2512108,我几乎找到了我想要的东西。

他的查询有效,但最后一列只给出了第一个选项。有没有办法让它返回所有选项AVAILABLE(不仅是想要的选项)?

3 个答案:

答案 0 :(得分:2)

答案:

select item_id, group_concat(option_id order by option_id asc) options
  from options
  where option_id in (1, 2, 3)
  group by item_id
  having count(option_id) = 3

小提琴:http://sqlfiddle.com/#!9/04f69/3

由于表格架构并未真正明确提及,因此我将离开加入您的其他表格以及其他标准。

修改 不,我不会,我讨厌半个答案。

select item_id, group_concat(option_id order by option_id asc) options
  from main_table m
  inner join options o
    on m.id = o.item_id
  where option_id in (1, 2, 3)
    AND crit1 = 2
    AND crit2 = 3
  group by item_id
  having count(option_id) = 3

更新了小提琴:http://sqlfiddle.com/#!9/45bee/1

如果您希望它返回至少包含所有REQUIRED选项的项目可用的所有选项,那么您的查询是:

 select o.item_id, group_concat(o.option_id) options
   from options o
   inner join (
     select item_id
       from main_table m
       inner join options o
         on m.id = o.item_id
       where option_id in (1, 2, 3)
       AND crit1 = 2
       AND crit2 = 3
     group by item_id
     having count(option_id) = 3

最后小提琴:http://sqlfiddle.com/#!9/d60b3/1

答案 1 :(得分:0)

如你所述: '标准和选项不同'

'所有选项都可在选项表'

中找到

我假设你有两张桌子;即main_table和options_table

SELECT id, option 
FROM main_table
WHERE crit1='value1'
and crit2 = 'value2'
and id IN(
        SELECT id
          FROM main_table
          WHERE option IN (select options from options_table)
          GROUP BY id
          HAVING COUNT(*) = (select count(options) from options_table)

在此处查找类似的问题: SQL selecting rows where one column's value is common across another criteria column

答案 2 :(得分:0)

制作它!最后,谢谢你

SELECT main_table.*, (SELECT GROUP_CONCAT(feature_id) FROM featuring WHERE main_id = main_table.id) options FROM main_table
RIGHT JOIN featuring 
    ON main_table.id = featuring.main_id 
WHERE featuring.feature_id IN (WANTEDOPTIONS) 
GROUP BY main_table.id 
HAVING COUNT(DISTINCT featuring.feature_id) = NUMBEROFWANTEDOPTIONS

它为我提供了主要和所有AVAILABLE选项的所有信息 再次感谢。