我有一个很大的值集,比如表“table\u name”
('12345','12345', '48373')
事实上,这个清单要大得多。2万左右。
表如下:
**processid** **desc**
12345 name
48373 name2
我希望结果井然有序并保留副本。当我这样询问时:
SELECT processid, desc FROM table_name WHERE processid IN ('12345','12345', '48373');
结果是:
12345 name
48373 name2
但我想:
12345 name
12345 name
48373 name2
3条答案
按热度按时间pkwftd7m1#
简单的答案是:不能在where子句中得到结果。
现在让我解释一下原因。这个
WHERE
子句是筛选表中数据的一组条件,它决不会向现有数据中添加更多数据。如果您的表中有2个注册中心,并且您不能在查询它的结果中添加更多的注册中心(除非您使用salman向您展示的东西)。所以如果你的table只是
结果将仅基于这两行。这个
WHERE
子句将只检查该条件的计算结果是true还是false,因此:processid IN ('12345','12345', '48373')
这将针对中的所有值进行测试processid
像这样的列逐行(大致解释):对于行(12345 name),是
IN
条款:正确对于行(48373 name2),是
IN
条款:正确那么您只有两行作为结果。
就像我之前说过的,如果不使用一些技术,实际上会将更多的行添加到结果集中(union all、cte或其他什么),那么根据在结果集中添加条件的次数,就不能得到想要的结果
WHERE
条款。fhg3lkii2#
解决方法可以是通过编程的方式,您可以保留一个具有键和值的多维数组,其中键将是processid,值将是计数(您希望显示processid的次数)。在查询结果循环的迭代中,您可以用数组的键检查processid,并可以按数组的值显示。
希望这有帮助。
ukxgm1gy3#
按指定的顺序检索记录
IN
条款,您需要移动您的IN
子select语句的条件并使用JOIN ON
结果集的一部分。为了减少混淆并加快速度,请使用临时表来保存要从主表中检索的值。使用自动递增列保留所需的记录顺序。
示例http://sqlfiddle.com/#!9/a4e6ab/2号
结果
为什么?
WHERE IN
不起作用如前所述,mysql不使用
WHERE
保留所需顺序的条件,并将忽略其中包含的重复计算。这是因为WHERE
条件仅计算为true
或者false
,以确定从表中检索或影响哪些记录。只匹配WHERE
评估的条件true
.IN
具体地说,可以认为是一种浓缩形式的重复OR
指定列上的条件。意思是原始查询扩展为;在中查找记录
table_name
有一个processid
等于12345或12345或48373。例如,使用下表数据
使用如下查询
扩展为:;查找具有
id
等于1或3。结果如下记录集