Чтобы извлечь записи в порядке, указанном в предложении 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|