选择与所有数组值匹配的结果 [英] Select result that match ALL array values

查看:89
本文介绍了选择与所有数组值匹配的结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想解决这个问题已经有一段时间了,但我似乎无法自己解决.

I'm trying to solve this for quite a moment now and I don't seem to be able to do it by myself.

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

I'd like to store OPTIONS linked to IDs, and when needed, get the results that match all wanted OPTIONS. I thought about doing it this way:

ID    |    OPTION

aaa   |  1
aaa   |  2
aaa   |  3

bbb   |  1
bbb   |  2

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

ID和OPTION是外键.

Where ID and OPTION are FOREIGN KEYS.

最终请求看起来像

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

我可以使其正常工作还是应该更改实施方式?

Can I make it work or should I change the implementation?

您对我有什么建议?


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


Thanks to https://stackoverflow.com/a/7505147/2512108, I almost found what I want.

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

His query works but the last column only gives the 1st option alone. Is there a way to make it return ALL the options AVAILABLE (not only the wanted ones) ?

推荐答案

答案:

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

由于没有真正明确提及表模式,因此我将把与其他表的联接以及其他条件留给您.

I'll leave the joining to your other table up to you, as well as the other criteria since the table schema isn't really explicitly mentioned.

编辑 不,我不会,我讨厌一半的答案.

EDIT No I won't, I hate half an answer.

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选项的项的所有可用选项,则您的查询如下:

And if you want it to return ALL options available to an item that has at minimum all of the REQUIRED options, your query is this:

 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

With a final fiddle here: http://sqlfiddle.com/#!9/d60b3/1

这篇关于选择与所有数组值匹配的结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆