我有大量的值,例如表“ 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');
答案 0 :(得分:2)
对您来说,简单的答案是:您不能基于where子句获得该结果。
现在让我解释一下原因。 WHERE
子句是过滤表中数据的一组条件,决不能将更多数据添加到现有数据中。如果您的表中有2个注册表,并且您不能在查询结果的基础上添加更多的注册表(除非您使用类似Salman的显示方式)。
因此,如果您的桌子只是
12345 name
48373 name2
结果将仅基于这两行。 WHERE
子句只会检查该条件的值为真还是假,所以:
processid IN ('12345','12345', '48373')
将会针对processid
列中的所有值进行逐行测试(大致解释):
IN
子句中的processid值:TRUE IN
子句中的processid值:TRUE 那么您只有两行作为结果。
就像我之前说过的那样,如果不使用某种实际上将更多行添加到结果集中的技术(全部,CTE或其他方式),则无法根据在条件中添加条件的次数获得所需的结果WHERE
子句。
答案 1 :(得分:1)
解决方法可能是通过编程实现的,您可以使用键和值保留多维数组,其中键将是processid,value将是计数(您希望显示processid的次数)。在查询结果循环的迭代中,您可以使用数组的键检查processid,并可以按array的值显示。
希望这会有所帮助。
答案 2 :(得分:1)
要按照IN
子句中指定的顺序检索记录,您需要将IN
条件移至子选择语句,并使用该结果集的JOIN ON
到您的主表。
为减少混乱并提高速度,请使用临时表保存要从主表中检索的值。使用自动递增列来保留所需的记录顺序。
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|