Вместо того, чтобы делать то, что вы пытаетесь сделать, просто выберите нужные уникальные строки. В коде внешнего интерфейса сохраните каждую уникальную строку один раз в структуре ключ => значение, где ключ — это идентификатор элемента, а значение — любые данные, которые вам нужны об этом элементе.
После этого вы можете использовать логику внешнего интерфейса для вывода их в нужном порядке, включая дубликаты. Это уменьшит количество избыточных данных, которые вы пытаетесь выбрать.
Например, Это непригодный для использования код — требуемый синтаксис зависит от вашего языка сценариев.
-- 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
person
Simon at My School Portal
schedule
23.02.2012