我有一个名为'匹配'的表格,我将表格“数字”中的项与表格“letters”中的项目相关联。 / p>
所以它看起来像
number_id, letter_id
1,10
2,10
3,10
5,11
4,23
7,19
1,19
3,64
现在用户输入一组数字,比如1,2,3 而且我必须找到所有数字都是1,2,3的字母,这将是10.如果他们给了1,7,它会给他们19,如果他们给3,它会给他们和64。
我该怎么做?
我一直在尝试为此编写一个递归函数,但它总是会破坏。 有某种:
SELECT letter_id WHERE **number_id***s* = 1,2,3. That would be perfect. :)
答案 0 :(得分:2)
这可能会或可能不会在所有情况下都有效,但我尝试了(1,2,3)和(1,7):
select distinct letter_id
from r r1
inner join r r2 using (letter_id)
where r1.number_id in (1, 7)
and r2.number_id in (1,7)
and (r1.number_id r2.number_id);
您必须能够动态地使用某种编程语言提供(1,7)
或(1,2,3)
。
凌晨3:30摇摇宝宝......
编辑:要完成@ Martin的答案,您可以使用order by field()
select letter_id
from (
select letter_id,
group_concat(number_id order by field(number_id,2,1,3)) as numset
from r
group by letter_id
) as Martin
where numset = '2,1,3';
答案 1 :(得分:1)
如果您可以从number_ids列表构造一个字符串,则可以使用以下查询:
select letter_id
from (select letter_id, group_concat(number_id) as numset from `matches`
group by letter_id) as fred
where numset = '1,2,3';
它对订单很敏感(例如'2,1,3'不匹配)。
答案 2 :(得分:0)
由于之前的评论使问题超出OP的范围,所以这是另一个答案......
您可以通过使用临时表来解决问题:
create temporary table r_sum as
select letter_id, count(*) as total
from r
group by letter_id;
create temporary table r_count as
select letter_id, count(*) as total
from r
where number_id in (1,2,3,7)
group by letter_id;
select letter_id
from r_sum
inner join r_count using (letter_id, total);
我认为如果这不能回答你的问题,我就没有得到你想要的东西以及如何帮助你。如果表很大,则必须在临时表上创建索引以帮助加快速度。 r
是您在OP中的原始表格。
答案 3 :(得分:-1)
你必须使用IN语句。
尝试以下查询。
SELECT letter_id WHERE number_id IN (1,2,3)
如果你有,可以将数组变量传递给IN语句。
感谢。