选择Where With Multiple的相同位置

时间:2010-11-29 06:27:34

标签: php mysql pdo

我有一个名为'匹配'的表格,我将表格“数字”中的与表格“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. :)

4 个答案:

答案 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语句。

感谢。