Autor | Zpráva | ||
---|---|---|---|
Pleak Profil * |
#1 · Zasláno: 30. 5. 2018, 12:52:03
Zdravím,
přemejšlím jak vyřešit následující situaci: Mám následující dotaz: select p.jmeno, p.fotka_absolventi, k.kurzy_id from kurzy_prihlasky p left join kurzy k on k.id = p.kurz_id left join navigace n on n.id = k.nav_id_absolventi where (n.url = '/moje-url/ and nezobrazit_absolventi = 0) or k.id in (15,17,13) A já bych potřeboval nahradit část "k.id in (15,17,13)" hodnotou ze sloupce k.kurzy_id (zde mám uložené ID oddělené čárkou - 15,17,13). Dá se to vyřešit nějak vnořeným dotazem, nebo si nad tím musim udělat ještě jeden dotaz? Díky za radu! |
||
Tomášeek Profil |
#2 · Zasláno: 30. 5. 2018, 13:00:37
Pleak:
Začni tím, že přestaneš ukládat data ve tvaru 15,17,13 , ale jako 3 samostatné záznamy.
|
||
Pleak Profil * |
#3 · Zasláno: 30. 5. 2018, 13:03:31
Tomášeek:
Díky za odpověď, každopádně tato rada je pro mě irelevantní, ptal jsem se jak vyřešit danou situaci (ano, pokud bych to měl jako 3 záznamy, tak to vím jak napojit, ale mám zde tuto situaci, u které prosím o radu). |
||
Tomášeek Profil |
#4 · Zasláno: 30. 5. 2018, 13:13:00
Pleak:
Komu není rady... Hodně štěstí. |
||
Keeehi Profil |
#5 · Zasláno: 30. 5. 2018, 14:39:24
Pleak:
„každopádně tato rada je pro mě irelevantní, ptal jsem se jak vyřešit danou situaci“ Situaci vyřešíš jedině tak, že předěláš návrh databáze. Více hodnot ve sloupci je častá chyba. Funkce pro rozdělení řetězce na pole řetězců podle nějakého znaku v mysql neexistuje. Na internetu se dají dohledat vlastní implementace uložených procedur, které to zvládnou. Ovšem co jsem viděl, tak všechny uvnitř používají dočasné tabulky. To znamená, že při zavolání dotazu s touto procedurou se vytvoří tolik dočasných tabulek, kolik je řádků v tabulce. Efektivita nebude moc velká. Ovšem když to rozdělíš do dvou tabulek, bude to jen svištět. |
||
Kajman Profil |
#6 · Zasláno: 30. 5. 2018, 14:59:57
V tomto dotaze by šla použít funkce find_in_set, ale svižnější to bude s tou doporučovanou další indexovanou tabulku.
|
||
Pleak Profil * |
#7 · Zasláno: 30. 5. 2018, 16:37:35
Oukej, rozumím, díky za rady.
Pokud to tedy předělám, budu mít tabulku dejme tomu "kurzy_absolventi", kde budu mít sloupce "kurz_absolventi_id" a "kurz_id" a v ní záznamy: 14 - 17 14 - 15 14 - 13 jak tam přidám tu možnost, že chci tyto záznamy tam také zobrazit? Pokud to udělám nějak takto, tak se nedostanu k té hodnotě "k.id" ve vnořeném dotazu: select p.jmeno, p.fotka_absolventi from kurzy_prihlasky p left join kurzy k on k.id = p.kurz_id left join navigace n on n.id = k.nav_id_absolventi where ( n.url = '/moje-url/' or id in ( select kurz_id from kurzy_absolventi where kurz_id_absolventi = k.id ) ) and nezobrazit_absolventi = 0 Děkuji za radu |
||
Tomášeek Profil |
#8 · Zasláno: 30. 5. 2018, 16:49:27
Pleak:
Tak ono to hlavně nemusí být jako poddotaz ve WHERE , ale jako další JOIN . Pokud jsem tedy nic nepřehlédl. Mělo by to být i rychlejší.
|
||
Keeehi Profil |
#9 · Zasláno: 30. 5. 2018, 18:01:12
Tomášeek:
Problém s joinem pak trochu je, že se mu tam pak jeden záznam může vyskytnout vícekrát. Takže pak by bylo potřeba udělat group by nebo select distinct. Já bych to asi nechal v podmínce, jen to zapsal správně. Pleak: Problém trochu je, že se se v těch tabulkách ztrácím. Mohl by jsi sem prosím vypsat sloupce tabulek kurzy_prihlasky, kurzy, navigace a v případě, že to z jejich názvu není poznat, co v nich je? A ještě 15, 17, 13 mají být IDčka jakých entit? Kurzů, přihlášek, lidí nebo něčeho jiného? |
||
Pleak Profil * |
#10 · Zasláno: 30. 5. 2018, 19:43:16
Ono to jde např. takhle:
SELECT * FROM `kurzy_prihlasky` where kurz_id in ( select k2.kurz_id from kurzy k left join kurzy_absolventi k2 on k2.kurz_id_absolventi = k.id left join navigace n on n.id = k.nav_id_absolventi where n.url = '/moje-url/' ) Ale problém je, že to vypíše jen ty navázané kurzy a jejich přihlášené, ale už to nevypíše ten daný kurz s url '/moje-url/'. Takže to sice jde např. upravit takhle: SELECT p.* FROM kurzy_prihlasky p LEFT JOIN kurzy k ON k.id = p.kurz_id LEFT JOIN navigace n ON n.id = k.nav_id_absolventi WHERE kurz_id IN (SELECT k2.kurz_id FROM kurzy k LEFT JOIN kurzy_absolventi k2 ON k2.kurz_id_absolventi = k.id LEFT JOIN navigace n ON n.id = k.nav_id_absolventi WHERE n.url = '/moje-url/' ) OR n.url = '/moje-url/' Což však nevím, zda je optimální řešení :). |
||
Časová prodleva: 6 let
|
0