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

时间:2018-10-25 15:14:48

标签: mysql sql

我有大量的值,例如表“ table_name”中的值

setup()

该列表实际上要大得多。大约2万。

表是这样的:

draw()

我希望结果按顺序排列并保留重复项。当我这样查询时:

('12345','12345', '48373')

结果是:

 **processid**     **desc**
 12345              name
 48373              name2

但是我想要

SELECT processid, desc FROM table_name WHERE processid IN ('12345','12345', '48373');

3 个答案:

答案 0 :(得分:2)

对您来说,简单的答案是:您不能基于where子句获得该结果

现在让我解释一下原因。 WHERE子句是过滤表中数据的一组条件,决不能将更多数据添加到现有数据中。如果您的表中有2个注册表,并且您不能在查询结果的基础上添加更多的注册表(除非您使用类似Salman的显示方式)。

因此,如果您的桌子只是

 12345   name
 48373   name2

结果将仅基于这两行。 WHERE子句只会检查该条件的值为真还是假,所以:

processid IN ('12345','12345', '48373')将会针对processid列中的所有值进行逐行测试(大致解释):

  • 对于行(名称为12345),是IN子句中的processid值:TRUE
  • 对于行(48373 name2),它是IN子句中的processid值:TRUE

那么您只有两行作为结果。

就像我之前说过的那样,如果不使用某种实际上将更多行添加到结果集中的技术(全部,CTE或其他方式),则无法根据在条件中添加条件的次数获得所需的结果WHERE子句。

答案 1 :(得分:1)

解决方法可能是通过编程实现的,您可以使用键和值保留多维数组,其中键将是processid,value将是计数(您希望显示processid的次数)。在查询结果循环的迭代中,您可以使用数组的键检查processid,并可以按array的值显示。

希望这会有所帮助。

答案 2 :(得分:1)

要按照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|