MySQL - 在 WHERE IN 查询中保留重复项和顺序

标签 mysql sql

我有一大组值,例如表“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标准仅评估为 truefalse ,以确定要检索或影响表中的哪些记录。仅匹配 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/

相关文章:

php - Yii,单一关系中的双重标准

php - 使用 near order by id desc limit 1 的正确语法

php - 使用ajax登录不工作

mysql - 查询顶部条目及其值的列表

sql - 如何在替代条件(2 个中的 1 个)条件下加入表

Windows Azure 中的 Sql 服务器名称别名

mysql - 如何并排显示两个查询的结果?

mysql - 从标签设置中选择具有特定标签的所有用户

mysql - 如何将 ORDER BY 和 LIMIT 与 UPDATE 一起使用?

sql - 在 MS SQL Server Management Studio 中处理事务的最佳方式