しようとしていることを行う代わりに、必要な一意の行を選択するだけです。フロントエンド コードでは、各一意の行を key=>value 構造に 1 回格納します。ここで、key はアイテム ID で、value はそのアイテムについて必要なデータです。
それができたら、フロントエンド ロジックを使用して、重複を含む目的の順序でそれらを出力できます。これにより、選択しようとしている冗長データの量が減ります。
たとえば、これは使用できないコードです - 必要な正確な構文は、スクリプト言語によって異なります
-- 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