强制 MySQL 从 WHERE IN 子句返回重复项而不使用 JOIN/UNION?
Posted
技术标签:
【中文标题】强制 MySQL 从 WHERE IN 子句返回重复项而不使用 JOIN/UNION?【英文标题】:Force MySQL to return duplicates from WHERE IN clause without using JOIN/UNION? 【发布时间】:2011-01-16 13:55:24 【问题描述】:这可能不是很明智,但是如果WHERE IN
子句中有重复的条件,我想让 mysql 返回确切的重复行。这可能吗?
举个例子:
SELECT
columns
FROM
table
WHERE
id IN( 1, 2, 3, 4, 5, 1, 2, 5, 5)
我希望 MySQL 向我返回 id 为 5 的行 3 次,id 为 1 和 2 的行两次,以及 3 和 4 的一次。
由于IN
参数的长度以及重复计数(一次、两次、三次等)是任意的,我不想依赖UNION
或JOIN
。否则这样的事情可能吗?
【问题讨论】:
【参考方案1】:我不确定您为什么要禁止 JOIN,因为它对 SQL 来说相当重要。这就像禁止函数式语言中的函数调用。
解决这个问题的一个好方法是创建一个结果集,其中包含您想要返回的 ID 并加入其中。这是一种方法:
SELECT Table1.*
FROM Table1
JOIN (SELECT 1 AS id
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 5
UNION ALL SELECT 5) AS T1
ON Table1.id = T1.id
我不确定您是否考虑过这种方法?它没有您似乎害怕的问题。
如果你禁止加入,除非你使用存储过程,否则你不能这样做,我会说这比加入更糟糕。
【讨论】:
嗨,马克,感谢您的回答。从表面上看,我想我只需要使用 JOIN 和 UNION 即可。我不知道您在这里使用 UNION 的方式。我什至不确定我是否完全理解它。 :) 但它看起来非常漂亮!起初我不想使用 UNION 的原因是因为我认为我必须一遍又一遍地重复确切的 SELECT 语句。不过这看起来干净多了。 顺便问一下,这些 UNION 会保证结果的确切顺序,还是我仍然需要使用 ORDER 子句来完全按照语句中的顺序对它们进行排序? 如果您想保证订单,您需要订单。这总是正确的。幸运的是,很容易更改上面的查询:SELECT 1 as ID, 1 as SortOrder UNION ALL SELECT 2, 2 UNION ALL SELECT 3, 3
等...然后在JOIN ... ON ...
之后的末尾ORDER BY SortOrder
。
谢谢马克。我会接受这是最好的答案。你向我展示了一些新的技巧。不错!以上是关于强制 MySQL 从 WHERE IN 子句返回重复项而不使用 JOIN/UNION?的主要内容,如果未能解决你的问题,请参考以下文章
在MySQL存储过程中的WHERE子句中使用IN param