Autor Zpráva
Hitman
Profil
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
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.)
Blbost, pardon.
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
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
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
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
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
     )

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: