mysql-keep-duplicates和order-in-where-in查询

9vw9lbht  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(246)

我有一个很大的值集,比如表“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
pkwftd7m

pkwftd7m1#

简单的答案是:不能在where子句中得到结果。
现在让我解释一下原因。这个 WHERE 子句是筛选表中数据的一组条件,它决不会向现有数据中添加更多数据。如果您的表中有2个注册中心,并且您不能在查询它的结果中添加更多的注册中心(除非您使用salman向您展示的东西)。
所以如果你的table只是

12345   name
 48373   name2

结果将仅基于这两行。这个 WHERE 子句将只检查该条件的计算结果是true还是false,因此: processid IN ('12345','12345', '48373') 这将针对中的所有值进行测试 processid 像这样的列逐行(大致解释):
对于行(12345 name),是 IN 条款:正确
对于行(48373 name2),是 IN 条款:正确
那么您只有两行作为结果。
就像我之前说过的,如果不使用一些技术,实际上会将更多的行添加到结果集中(union all、cte或其他什么),那么根据在结果集中添加条件的次数,就不能得到想要的结果 WHERE 条款。

fhg3lkii

fhg3lkii2#

解决方法可以是通过编程的方式,您可以保留一个具有键和值的多维数组,其中键将是processid,值将是计数(您希望显示processid的次数)。在查询结果循环的迭代中,您可以用数组的键检查processid,并可以按数组的值显示。
希望这有帮助。

ukxgm1gy

ukxgm1gy3#

按指定的顺序检索记录 IN 条款,您需要移动您的 IN 子select语句的条件并使用 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|

相关问题