Вместо того, чтобы делать то, что вы пытаетесь, просто выберите нужные вам уникальные строки.В коде внешнего интерфейса сохраняйте каждую уникальную строку по одному разу в структуре ключ => значение, где ключ - это идентификатор элемента, а значение - все необходимые данные об этом элементе.
После того, как вы это сделаете, вы можете использовать логику внешнего интерфейса.выводить их в нужном порядке, включая дубликаты.Это уменьшит объем избыточных данных, которые вы пытаетесь выбрать.
Например, Это неиспользуемый код - точный синтаксис зависит от вашего языка сценариев
-- setup a display order
displayOrder= [1,2,1,3];
-- select data from database, order doesn't matter here
SELECT id,date
FROM items
WHERE id IN (displayOrder);
-- cache the results in a key=> value array
arrCachedRows = {};
for (.... each db row returned ...) {
arrCachedRows[id] = date;
}
-- Now output in desired order
for (listIndex in displayOrder) {
-- Make sure the index is cached
if (listIndex exists in arrCachedRow) {
echo arrCachedRows[listIndex ];
}
}
Если вы должны продолжать использовать UNION, несмотря на мои предупреждения
Если вы идете против вышеуказанной рекомендации и абсолютно ДОЛЖНЫ вернуть их в 1 запросе в таком порядке, то добавьте дополнительную строку, которая будетобеспечить порядок строк.Смотрите ниже запрос, где я использую переменную @subIndex, чтобы добавить инкрементное значение как subIndex.Это, в свою очередь, позволяет вам изменить порядок в соответствии с этим, и он будет в запрошенном порядке.
SELECT
i.*
FROM (
SELECT @subIndex:=@subIndex+1 AS subIndex, id, date FROM items where id = 1
UNION
SELECT @subIndex:=@subIndex+1 AS subIndex, id, date FROM items where id = 2
UNION
SELECT @subIndex:=@subIndex+1 AS subIndex, id, date FROM items where id = 1
UNION
SELECT @subIndex:=@subIndex+1 AS subIndex, id, date FROM items where id = 3
) AS i,(SELECT @subIndex:=0) v
ORDER BY i.subIndex
Или немного более чистая версия, которая сохраняет выбор элементов до внешней стороны и скрывает субиндекс
SELECT
items.*
FROM items
-- initialise variable
INNER JOIN (SELECT @subIndex:=0) v
-- create a meta-table with the ids desired in the order desired
INNER JOIN (
SELECT @subIndex:=@subIndex+1 AS subIndex, 1 AS id
UNION
SELECT @subIndex:=@subIndex+1 AS subIndex, 2 AS id
UNION
SELECT @subIndex:=@subIndex+1 AS subIndex, 1 AS id
UNION
SELECT @subIndex:=@subIndex+1 AS subIndex, 3 AS id
) AS i
ON i.id = items.id
-- order by the subindex from i
ORDER BY i.`subIndex` ASC