我想从select

时间:2016-02-16 20:55:28

标签: mysql

好的,有一张桌子。例如

CREATE TABLE table_name
(
id integer AUTOINCREMENT, --pk
name varchar(size)
);

现在我想通过ID列表获取行,例如5,6和10,所以我这样做:

SELECT name FROM table_name WHERE id IN (5,6,10)

这很明显。 关键是我不希望只有独特的结果。 我的意思是如果选择查询将是这样的:

SELECT name FROM table_name WHERE id IN (5,9,5)

我想得到3行作为答案: 名称为id = 5,id为9,名称为id = 5

如何正确地做到这一点?

4 个答案:

答案 0 :(得分:2)

一种选择是使用join代替in

select tn.name
from table_name tn join (
    select 5 as id union all 
    select 9 union all 
    select 5) t on tn.id = t.id

或者您可以单独使用union all

select name from table_name where id = 5
union all
select name from table_name where id = 9
union all
select name from table_name where id = 5

答案 1 :(得分:0)

您可以通过多次对同一个查询执行此操作,每次使用不同的ID,并使用UNION ALL“加入”每个查询的结果:

SELECT name FROM table_name WHERE id = 5
UNION ALL
SELECT name FROM table_name WHERE id = 9
UNION ALL
SELECT name FROM table_name WHERE id = 5

请注意,使用UNION ALL而不仅仅UNION来获得所需的结果非常重要:使用UNION,MySQL会删除重复的行,这将完全相同结果为使用IN (5, 9, 5)

答案 2 :(得分:0)

此声明应该可以正常工作:

 SELECT `name` FROM `table_name` WHERE `id` IN (5, 6, 10)

当然,您需要为id列添加重复值。如果id是主键或具有唯一索引,那么您的表格就不会有两行id = 5。

答案 3 :(得分:0)

确定。我做了类似的事情:

SET @ids = '4,5,5';
create temporary table if not exists tmp_ids ( oid integer);
    SET @S1 = CONCAT("INSERT INTO  tmp_ids(oid) VALUES ('",REPLACE((@ids), ",", "'),('"),"');");
    PREPARE stmt1 FROM @s1;
EXECUTE stmt1;

现在我只是在select期间使用tmp表加入。之后我放弃了tmp表。 THX寻求帮助。