Portál AbcLinuxu, 26. května 2024 21:12
| ID | VALUE1 | VALUE2 | VALUE3 | | 1 | a1 | a10 | a5 | | 2 | a11 | a3 | a40 | | 3 | a66 | a13 | a0 |a ted bych rad vybral vsechny zaznamy, ktere obsahuji pismeno "a" a mel je serazene (idealne natural sort, ale netrvam na tom) a to tak, aby vysledek vypadal nejak takto:
| ID | VALUE | | 3 | a0 | | 1 | a1 | | 2 | a3 | | 1 | a5 | | 1 | a10 | | 2 | a11 | | 3 | a13 | | 2 | a40 | | 3 | a66 |zatim to delam hloupe tak, ze to vyhledavam separe a pak to sortuju v PHP. zajima mne, jestli lze sestavit SQL dotaz, ktery by to sam zvladnul dekuji.
UNION ALL
select T.ID ,case E.VAL when 'VALUE1' then T.VALUE1 when 'VALUE2' then T.VALUE2 when 'VALUE3' then T.VALUE3 end as VALUE from T cross join razdvatri as E order by VALUEtabulka razdvatri vypadá následovně:
'VAL' ---- VALUE1 VALUE2 VALUE3
Stačí si uvědomit, že jeden zdrojový řádek se roznásobí na tři cílové. Jakým trikem si tabulku razdvatri vyrobíte je na vás.
Sort je jen třešinka na dortu.
Další varinata je udělat union ze tří selectů {VALUE1,VALUE2,VALUE3}, ale to znamená sjíždět tabulku T 3× což asi nebude úplně optimální. Paradoxně join na třířádkouvou tabulku razrazdvatři, pravděpodobně vyjde z rychlostně lépe.
SELECT * FROM ( SELECT id, value1 AS value FROM tabulka WHERE value1 LIKE '%a%' UNION ALL SELECT id, value2 AS value FROM tabulka WHERE value2 LIKE '%a%' UNION ALL SELECT id, value2 AS value FROM tabulka WHERE value2 LIKE '%a%' ) AS t ORDER BY t.value
| ID | TYPE | VALUE | | 1 | VALUE1| a1 | | 1 | VALUE2| a10 | | 1 | VALUE3| a5 | | 2 | VALUE1| a11 | | 2 | VALUE2| a3 | | 2 | VALUE3| a40 | | 3 | VALUE1| a66 | | 3 | VALUE2| a13 | | 3 | VALUE3| a0 |Pak by i ten vámi požadovaný dotaz byl triviální.
Tiskni Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.