Autor Zpráva
Pleak
Profil *
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
Pleak:
Začni tím, že přestaneš ukládat data ve tvaru 15,17,13, ale jako 3 samostatné záznamy.
Pleak
Profil *
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
Pleak:
Komu není rady... Hodně štěstí.
Keeehi
Profil
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
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 *
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
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
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 *
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í :).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: