Заставить MySQL возвращать дубликаты из предложения WHERE IN без использования JOIN/UNION?

Это может быть не очень разумно, но я бы хотел, чтобы MySQL возвращал мне точные повторяющиеся строки, если в предложении WHERE IN есть повторяющиеся критерии. Это возможно?

Возьмите этот пример:

SELECT
   columns
FROM
   table
WHERE
   id IN( 1, 2, 3, 4, 5, 1, 2, 5, 5)

Я бы хотел, чтобы MySQL возвращал мне строки с идентификатором 5 три раза, идентификаторы 1 и 2 дважды и 3 и 4 один раз.

Поскольку длина аргументов IN, а также количество дубликатов (один, два, три раза и т. д.) будут произвольными, я не хочу полагаться на UNION или JOIN. Возможно ли что-то подобное иначе?


person Decent Dabbler    schedule 13.02.2010    source источник


Ответы (1)


Я не уверен, почему вы хотите запретить JOIN, так как это очень важно для SQL. Это похоже на запрет вызовов функций в функциональном языке.

Хороший способ решить эту проблему — создать набор результатов, содержащий идентификаторы, которые вы хотите вернуть, и присоединиться к ним. Вот один из способов сделать это:

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

Я не уверен, рассматривали ли вы этот метод? У него нет ни одной из проблем, которых вы, кажется, боитесь.

Если вы запрещаете присоединения, вы не можете этого сделать, если не используете хранимую процедуру, что, я бы сказал, хуже, чем присоединение.

person Mark Byers    schedule 13.02.2010
comment
Привет Марк, спасибо за ваш ответ. Судя по всему, я думаю, что тогда мне просто придется пойти с JOIN и UNION. Я не знал об использовании UNION так, как вы его используете здесь. Я даже не уверен, что полностью это понимаю. :) Но это выглядит очень изящно! Причина, по которой я сначала не хотел использовать UNION, заключается в том, что я думал, что мне придется повторять точные операторы SELECT снова и снова. Это выглядит намного чище. - person Decent Dabbler; 14.02.2010
comment
Кстати, будут ли эти UNION гарантировать точный порядок результата, или мне все равно нужно будет использовать предложение ORDER, чтобы упорядочить их точно так, как они были в операторе? - person Decent Dabbler; 14.02.2010
comment
Вам нужен заказ до, если вы хотите гарантировать заказ. Это всегда верно. К счастью, приведенный выше запрос легко изменить: SELECT 1 as ID, 1 as SortOrder UNION ALL SELECT 2, 2 UNION ALL SELECT 3, 3 и т. д... затем ORDER BY SortOrder в конце после JOIN ... ON .... - person Mark Byers; 14.02.2010
comment
Спасибо, Марк. Я приму это как лучший ответ. Ты показал мне несколько новых трюков. Хороший! - person Decent Dabbler; 14.02.2010