Zadejte hledaný výraz...

Podmínka IF v MySQL – řazení dle podmínky

Lukáš Král
verified
rating uzivatele
(2 hodnocení)
9. 12. 2010 11:25:27
Zdravím Vás,
řeším problém s řazením dat - výpis z databáze.
Mám na serveru inzeráty různých firem (zaměstnavatelů), všechny potřebuji řadit od nejnovějších po nejstarší až na výjímku - inzeráty od jednoho inzerenta (úřadu práce) potřebuji řadit opačně, tedy začít od nejstarších až po nejnovější, přičemž prvně se musí vypsat všechny inzeráty zaměstnavatelů a až za nimi inzeráty úřadu práce.
Chtěl jsem to řešit tak, že přímo v dotazu užiju podmínku IF, kde zjistím ID inzerenta a podle toho se provede řazení, ovšem pořád se mi to nějak nedaří.
Děkuji za Vaše případné rady.
9. 12. 2010 11:25:27
https://webtrh.cz/diskuse/podminka-if-v-mysql-razeni-dle-podminky/#reply590227
Matus
verified
rating uzivatele
(6 hodnocení)
9. 12. 2010 11:42:10
V php nie som expert, ale mna by to napadlo riešit týmto spôsobom:
while(vsetci zamestanavatelia) {
zoradit od najnovsich po najstarsie
};
while(potom urad prace) {
zoradit od najstarsich po najnovsie
};
// Aha, ty potrebuješ najprv zistit ID inzerenta, takže nemáš ich už roztriedené ?
9. 12. 2010 11:42:10
https://webtrh.cz/diskuse/podminka-if-v-mysql-razeni-dle-podminky/#reply590226
Lukáš Král
verified
rating uzivatele
(2 hodnocení)
9. 12. 2010 11:48:14
současný SQL dotaz:
SELECT * FROM "._TABULKA_POZICE."
WHERE aktivni = '1' AND platne_do > NOW() $filtr
ORDER BY id_firmy = 936, $raditDle
LIMIT ".$Page*$Art."
Problém je ten, že řazení dle $raditDle se má použít jen když nejde o úřad práce (tedy id 936). Pokud jde o úřad práce, pak se místo toho musí použít řazení dle: vlozeno ASC
9. 12. 2010 11:48:14
https://webtrh.cz/diskuse/podminka-if-v-mysql-razeni-dle-podminky/#reply590225
naniccz
verified
rating uzivatele
(3 hodnocení)
9. 12. 2010 11:49:10
9. 12. 2010 11:49:10
https://webtrh.cz/diskuse/podminka-if-v-mysql-razeni-dle-podminky/#reply590224
duben
verified
rating uzivatele
(50 hodnocení)
9. 12. 2010 11:49:41
Lukáši udělej si dva SQL dotazy
V jednom pomocí WHERE vyfiltruj všechny inzerenty co nejsou úřad práce a ty pomocí ORDER BY řaď od nejnovějšího a vypisuj je.
V druhém dotazu pomocí WHERE vyfiltruj všechny inzeráty od úřadu práce a ty řaď pomocí ORDER BY od nejstaršího a vypisuj je.
9. 12. 2010 11:49:41
https://webtrh.cz/diskuse/podminka-if-v-mysql-razeni-dle-podminky/#reply590223
Lukáš Král
verified
rating uzivatele
(2 hodnocení)
9. 12. 2010 11:51:15
UNION - zkoušel jsem, bohužel mi dotaz pak ignorujde ORDER BY uvnitř obou dotazů.
---------- Příspěvek doplněn 09.12.2010 v 11:52 ----------
Dva SQL dotazy - To je věc, který bych se chtěl vyhnout a to z důvodu stránkování a možnosti vybírat si, kolik záznamů chci na jedné stránce.
9. 12. 2010 11:51:15
https://webtrh.cz/diskuse/podminka-if-v-mysql-razeni-dle-podminky/#reply590222
V ORDER BY můžete používat control-flow funkci CASE, ale myslím, že se tak dá změnit sloupec, ale ne směr řazení.
Třeba
Každopádně to zní jako úkol, který se nejlépe vyřeší dvěma spojenými dotazy.
9. 12. 2010 11:55:41
https://webtrh.cz/diskuse/podminka-if-v-mysql-razeni-dle-podminky/#reply590221
duben
verified
rating uzivatele
(50 hodnocení)
9. 12. 2010 11:56:00
Pokud oddelujes inzeraty pro beznou nabidku a urad prace, tak bych udelal strankovani pro oboje zvlast.
UNION razeni opravdu ignoruje, dalo by se to obejit z hlavy vim reseni pro MSSQL (2005 a vyssi), ale v MySQL to tak nejde. Zkusim kouknout jestli tam neni nejaka podobna vec jako je v tom MSSQL.
9. 12. 2010 11:56:00
https://webtrh.cz/diskuse/podminka-if-v-mysql-razeni-dle-podminky/#reply590220
K řazení v UNION se píše
To apply ORDER BY or LIMIT to an individual SELECT, place the clause inside the parentheses that enclose the SELECT:
a
However, use of ORDER BY for individual SELECT statements implies nothing about the order in which the rows appear in the final result because UNION by default produces an unordered set of rows. Therefore, the use of ORDER BY in this context is typically in conjunction with LIMIT, so that it is used to determine the subset of the selected rows to retrieve for the SELECT, even though it does not necessarily affect the order of those rows in the final UNION result. If ORDER BY appears without LIMIT in a SELECT, it is optimized away because it will have no effect anyway.
Takže pokud to chcete řadit úplně přesně i v rámci stránky, nezbyde vám, než udělat to, co píše Standa - provést dva dotazy a spojit je.
Se stránkováním ani počtem zobrazených inzerátů na stránce by neměl být žádný problém. Stránkujete přece podle celkového počtu aktivních inzerátů a inzeráty z úřadu práce jsou vždy až na konci.
Musel byste na každé stránce nejdřív načíst inzeráty z neúřadů, a pokud by jich bylo málo, doplnit je o inzeráty z úřadů.
9. 12. 2010 12:03:40
https://webtrh.cz/diskuse/podminka-if-v-mysql-razeni-dle-podminky/#reply590219
duben
verified
rating uzivatele
(50 hodnocení)
9. 12. 2010 12:09:08
Ono to půjde i jedním dotazem, ale bohužel MySQL neumí nic ROW_NUMBER(), takže řešení sem za chvíli napíšu, ale bude dost brutální a výkonem rozhodně nepotěší.
9. 12. 2010 12:09:08
https://webtrh.cz/diskuse/podminka-if-v-mysql-razeni-dle-podminky/#reply590218
Lukáš Král
verified
rating uzivatele
(2 hodnocení)
9. 12. 2010 12:12:54
Původně jsem myslel, že půjde jednoduše použít podmínka IF přímo v dotazu ...
9. 12. 2010 12:12:54
https://webtrh.cz/diskuse/podminka-if-v-mysql-razeni-dle-podminky/#reply590217
noximo
verified
rating uzivatele
(4 hodnocení)
9. 12. 2010 12:20:38
Řešením by bylo i vytvořit nový sloupec indetifikující úřad/neúřad (a popřípadě další) a řadit podle něho a až následně podle dalších parametrů
9. 12. 2010 12:20:38
https://webtrh.cz/diskuse/podminka-if-v-mysql-razeni-dle-podminky/#reply590216
duben
verified
rating uzivatele
(50 hodnocení)
9. 12. 2010 12:21:14
IF podmínka v dotazu nelze použít, protože data jsou v matici a buď se řadí jedním směrem, nebo druhým. Aby se řadili chvíli tak a chvíli tak opravdu v SQL nejde napsat. IF, nebo CASE slouží k tomu, aby se podle hodnoty dat vypisovalo v řádku něco specifikovaného, ale na řazení nemá vliv.
Hodně brutální řešení z hlediska výkonu je tohle:
Nezkoušel jsem to pustit, takže možná tam bude nějaký detail k doladění, ale princip je z toho asi jasný ... vezmu jednu čast a vypíšu u ní nějakou virutální ID hodnotu vypsaného řádku, u druhého to udělám taky ale krát -1, všechno to pak podle toho ID seřadím a mám výsledek.
Pokud by to příliš zatěžovalo databázi a předpokládám že to bude zatěžovat, tak bych používal tmp tabulky, kde by ID bylo a třeba každých X minut (řekněme po 10 min) bych ty tabulky smazal a znovu naplnil. Tím se vyruší nutnost mít Count pro spoustu volání v jednom dotazu a že nebudou data na webu absolutně live na vteřinu určitě web záporně neovlivní.
9. 12. 2010 12:21:14
https://webtrh.cz/diskuse/podminka-if-v-mysql-razeni-dle-podminky/#reply590215
noximo
verified
rating uzivatele
(4 hodnocení)
9. 12. 2010 12:30:15
Anebo zkus ještě toto:
SELECT * FROM "._TABULKA_POZICE."
WHERE aktivni = '1' AND platne_do > NOW() $filtr
ORDER BY FIELD(id_firmy, 936)
LIMIT ".$Page*$Art."
Možná tomu bude potřeba otočit ASC za DESC ale fungovat by to mělo...
9. 12. 2010 12:30:15
https://webtrh.cz/diskuse/podminka-if-v-mysql-razeni-dle-podminky/#reply590214
Lukáš Král
verified
rating uzivatele
(2 hodnocení)
9. 12. 2010 12:32:18
Tak jsem to napsal takto, snad to bude fungovat spolehlivě:
(SELECT * FROM "._TABULKA_POZICE."
WHERE aktivni = '1' AND platne_do > NOW() AND id_firmy <> 936 $filtr
ORDER BY $raditDle LIMIT 0,20)
UNION
(SELECT * FROM "._TABULKA_POZICE."
WHERE aktivni = '1' AND platne_do > NOW() AND id_firmy = 936 $filtr
ORDER BY vlozeno ASC LIMIT 0,20)
LIMIT ".$Page*$Art."
9. 12. 2010 12:32:18
https://webtrh.cz/diskuse/podminka-if-v-mysql-razeni-dle-podminky/#reply590213
Pro odpověď se přihlašte.
Přihlásit