强制 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 参数的长度以及重复计数(一次、两次、三次等)是任意的,我不想依赖UNIONJOIN。否则这样的事情可能吗?

【问题讨论】:

【参考方案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?的主要内容,如果未能解决你的问题,请参考以下文章

7_mysql查询之where子句

在MySQL存储过程中的WHERE子句中使用IN param

mySQL:如何在 WHERE IN 子句中删除 [重复]

Where - OLAP Cube 中的 In 子句

当列不明确时,有啥方法可以强制 Mysql 在 where 子句中使用 select 中的列?

MySQL Select 语句,WHERE 'IN' 子句