我有一大组值,例如表“table_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
最佳答案
按照 IN
中指定的顺序检索记录条款,您需要移动您的 IN
子选择语句的条件并使用 JOIN ON
将该结果集添加到您的主表中。
为了减少困惑并加快速度,请使用临时表来保存要从主表检索的值。使用自动增量列来保留所需的记录顺序。
示例 http://sqlfiddle.com/#!9/a4e6ab/2
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_ids (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
processid INT
);
INSERT INTO tmp_ids (processid)
VALUES
(12345),
(12345),
(48373);
SELECT
m.processid,
m.`desc`
FROM tmp_ids AS tmp
INNER JOIN main_table AS m
ON tmp.processid = m.processid
ORDER BY tmp.id ASC;
#optional drop the temporary table
DROP TEMPORARY TABLE IF EXISTS tmp_ids;
结果
| processid | desc |
|-----------|-------|
| 12345 | name |
| 12345 | name |
| 48373 | name2 |
为什么 WHERE IN
不会工作
正如前面提到的,MySQL 不使用 WHERE
标准保留所需的顺序,并将忽略它包含的重复评估。这是因为WHERE
标准仅评估为 true
或false
,以确定要检索或影响表中的哪些记录。仅匹配 WHERE
中指定的行计算结果为 true
的条件.
IN
具体来说可以被认为是重复OR
的压缩形式。指定列上的条件。
这意味着您的原始查询已扩展为;查找 table_name
中的记录有 processid
等于 12345 或 12345 或 48373。
例如使用下表数据
table_name
| id |
|----|
| 1|
| 1|
| 2|
| 1|
使用类似的查询
SELECT *
FROM table_name
WHERE id IN(1, 3);
展开为;查找具有 id
的记录等于 1 或 3。
结果如下记录集
| id |
|----|
| 1|
| 1|
| 1|
关于MySQL - 在 WHERE IN 查询中保留重复项和顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52992739/