好的,有一张桌子。例如
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
如何正确地做到这一点?
答案 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寻求帮助。