Autor | Zpráva | ||
---|---|---|---|
Hitman Profil |
#1 · Zasláno: 21. 2. 2016, 17:51:37
Dobrý podvečer,
Mám tabulku: ID....jeho_rodič 1.....0 2.....0 3.....1 4....1 A potřebuji vypsat pouze rodiče bez potomků, čili v tomto případě pouze ID 2. Je to možné udělat jedním SQL dotazem? Něco ve stylu: SELECT id FROM tabulka WHERE (WHERE rodic_id = 0) != 0 .
Jakoby vypsat pomocí sql pouze id kde rodic_id = 0, čili pouze rodiče. A potom ten výsledek znovu nalít do dotazu vyber všechny kde id_rodice != 0 a vybrat pouze ty ostatní ale nikoli z výsledku, ale z toho dotazu. Je to docela zamotané, už si s tím lámu hlavu půl hodiny a jediné co mě napdá udělat select, ten výsledek do dalšího selectu a ten potom porovnávat s tím předchozím.. Díky |
||
Kajman Profil |
#2 · Zasláno: 21. 2. 2016, 18:03:35
SELECT id FROM tabulka WHERE id NOT IN (SELECT jeho_rodic FROM tabulka) |
||
Fisir Profil |
Reaguji na Hitmana:
SELECT id FROM elementy WHERE id = (SELECT DISTINCT id FROM vztahy WHERE rodic = 0)
Ale nejsem na SQL žádný expert. (Netestováno.) |
||
Hitman Profil |
Supr, díky moc, Kajmanovo řešení funguje. A já už měl rozkreslené že vypíšu ty s nulou, od nich vypíšu jejich potomky, z nich vyhledám dalším dotazem rodiče a ty odečtu z toho prvního výpisu...taky by to fungovalo, jen by to bylo asi o 20x náročnější pro server :-)
// S tím že je potřeba doplnit: SELECT id FROM tabulka WHERE id NOT IN (SELECT jeho_rodic FROM tabulka) AND jeho_rodic !=0 Jinak tam budou i ti potomci. |
||
Hitman Profil |
Bylo by možné mě ještě trochu postrčit ve stylu že oba musí být publikování?
Použiji: SELECT id FROM tabulka WHERE id NOT IN (SELECT jeho_rodic FROM tabulka) A vypíšou se mi jak rodiče, tak potomci bez rodičů vypsaných potomků. Řekněme tedy bezdětní rodiče a potomci. Tak je to v pořádku, pokud k WHERE přidám AND publikovano = 1, znamená to že se vypíšou takové děti které jsou publikované. Potřebuji ale vyřešit aby se zobrazovali jen děti jejíchž rodič je publikován (publikovano = 1) Jak na to? Něco jako: SELECT id FROM tabulka WHERE id NOT IN (SELECT jeho_rodic FROM tabulka) AND (SELECT jeho_rodic) = 1 |
||
Kajman Profil |
#6 · Zasláno: 23. 2. 2016, 08:35:15
Použité názvosloví, moc nechápu - „bezdětní rodiče“ je přeci nesmysl.
Pokud hledáte koncové uzly, které mají rodiče publikovaného i samy jsou publikovány, tak to bude něco jako SELECT id FROM tabulka WHERE publikovano = 1 AND id NOT IN (SELECT jeho_rodic FROM tabulka) AND jeho_rodic IN (SELECT id FROM tabulka WHERE publikovano = 1) Pokud do koncových chcete zahrnout i ty, které nemají přímého publikovaného potomka, tak WHERE publikovano = 1 dáte i do první závorky. Ale obě varianty kontrolují, že je publikovaný jen rodič a ne všichni předci. Pozn.: ke stromovým dotazům mysql není vhodná, jestli máte na výběr, zvolte zavčasu např. postgresql nebo jinou databázi s podporou hiearchických dotazů. |
||
Hitman Profil |
#7 · Zasláno: 23. 2. 2016, 08:56:01 · Upravil/a: Moderátor (editace znemožněna) 23. 2. 2016, 10:35:53
Jedná se pouze o dvouúrovňovou strukturu, bezdětnými rodiči jsem nazval takové ID, které nemá děti. Čili počáteční uzel, který už dále nepokračuje. Tolik k vysvětlení pojmu.
Řešení samozdřejmě funguje a je logické, musím se naučit trochu abstraktněji uvažovat abych se příště nemusel ptát. Díky moc :-) Ještě mi dovolte poslední dotaz týkající se LEFT JOINU se selectem. Nyní používám: LEFT JOIN mezitabulka AS medias ON zakladni.id_polozky = medias.id_polozky LEFT JOIN obrazky AS media ON media.id_obrazku = medias.id_obrazku Je to součástí většího selectu a pokud má položka více obrázků, v selectu mi potom vypíše vše duplicitně jen s jinými obrázky. Chci ale vypsat pouze jeden obrázek. Napadlo mě tedy: LEFT JOIN (SELECT * FROM mezitabulka AS medias WHERE zakladni.id_polozky = medias.id_polozky LEFT JOIN obrazky AS media ON media.id_obrazku = medias.id_obrazku LIMIT 1) Ale pravděpodobně mám problém se syntaxí, protože mi to vypíše chybu... //A ještě asi poprosím o přesun do databází, nemůžu si zvyknout že tu je kategorie pro DB :-) |
||
Hitman Profil |
#8 · Zasláno: 23. 2. 2016, 11:21:48
A druhá věc:
Jak je tam AND jeho_rodic IN (SELECT id FROM tabulka WHERE publikovano = 1) Tak to potom vypíše jen děti které mají publikovaného rodiče. Ale co když se jedná o samotné rodiče? Pro ty tato podmínka platná nebude, protože další rodiče namají. Je tam možné přidat něco jako: AND (IF jeho_rodic != 0 THEN jeho_rodic IN (SELECT id FROM tabulka WHERE publikovano = 1)) ? Aby se ta podmínka AND jeho_rodic IN(SELECT...provedla pouze v případě že ten rodič není nulový (a tedy existuje) |
||
Kajman Profil |
#9 · Zasláno: 23. 2. 2016, 12:26:16
Hitman:
„Tak to potom vypíše jen děti které mají publikovaného rodiče.“ Ano, tak jste napsal zadání. „aby se zobrazovaly jen děti jejíchž rodič je publikován“. Pokud chcete podmínku, že má být rodič publikován nebo roven nule, tak použijete nebo. AND (jeho_rodic IN (SELECT id FROM tabulka WHERE publikovano = 1) OR jeho_rodic=0 ) |
||
Časová prodleva: 9 let
|
0