Autor Zpráva
Lion76
Profil *
Zdravim, mam nize uvedeny dotaz a nechapu, proc se nic nevypise, kdyz je z meho pohledu vsechno v poradku. Ale asi neni, kdyz tento dotaz nevraci zadny radek.

SELECT t1.nazev AS nazev1, t2.nazev AS nazev2
FROM tabulka1 AS t1
LEFT JOIN tabulka1 AS t2
USING (id)
WHERE t1.sloupec = 'podminka1'
AND t2.sloupec = 'podminka2'
Kajman_
Profil *
SELECT t1.nazev AS nazev1, t2.nazev AS nazev2
FROM tabulka1 AS t1
LEFT JOIN tabulka1 AS t2
on t1.id=t2.id
AND t2.sloupec = 'podminka2'
WHERE t1.sloupec = 'podminka1'
Lion76
Profil *
Kajman_

Ted ten dotaz vypise spravne hodnotu z prvniho sloupce, druhy sloupec obsahuje NULL. Proc?
Lion76
Profil *
Malicko jsem si s tim pohral a ted to vypisuje to, co ma.

SELECT t1.nazev AS nazev1, t2.nazev AS nazev2
FROM tabulka1 AS t1
LEFT JOIN tabulka1 AS t2 ON t2.sloupec = 'podminka2'
WHERE t1.sloupec = 'podminka1'
AND t2.sloupec = 'podminka2'


Vyreseno.
Lion76
Profil *
Ale stejne me to nedava klidu, proc to takhle funguje, kdyz Kajman_, profik teto diskuse sestavil dotaz, ktery by mel fungovat, ale nefunguje a me v tomto dalsim sestaveni funguje.

SELECT t1.nazev AS nazev1, t2.nazev AS nazev2 FROM tabulka1 AS t1 LEFT JOIN tabulka1 AS t2 ON t2.id = t2.id WHERE t1.sloupec = 'podminka1' AND t2.sloupec = 'podminka2'

Pokud nekdo budete mit cas, tak me to prosim vysvetlete. Predem dekuji.
Kajman_
Profil *
tak me to prosim vysvetlete
To nikdo nevysvětlí, protože jenom Vy opravdu víte, co chcete - jaké máte v tabulkách vazby a data a čeho chcete dosáhnout.

druhy sloupec obsahuje NULL. Proc?
To je vlastnost left join. Pokud nenajde odpovídající řádky dle podmínek v on, tak dá z druhé tabulky jen samé null hodnoty. Pokud to nechcete stačí slovíčko left vynechat.
Lion76
Profil *
Kajman_

Ja nechci spojit tabulky, ja jsem chtel spojit tabulku samou se sebou, proto tam je neustale "tabulka1". Spojit jednu tabulku podle id a podle podminek, tak abych v pripade, ze jedna podminka nebude splnena, tak db vrati 0 radku. Pokud jsou vsechny podminky splneny, tak db vrati jeden radek, ktery obsahuje data.

Odmazani LEFT nepomohlo, protoze ted db vrati 0 radku.
Kajman_
Profil *
Tak asi nebude v datech žádné id vyhovující oběma podmínkám.
Lion76
Profil *
Kajman_

Pokud by nebylo v datech zadne vyhovujici id, tak by ani nize uvedeny dotaz nevypsal data.

SELECT t1.nazev AS nazev1, t2.nazev AS nazev2 FROM tabulka1 AS t1 LEFT JOIN tabulka1 AS t2 ON t2.id = t2.id WHERE t1.sloupec = 'podminka1' AND t2.sloupec = 'podminka2'

Pokud mate chvilku cas, tak si to vyzkousejte, vytvorte si tabulku 'tabulka1' a dejte si tam dva nize uvedeny radky:

id | nazev|
1 | podminka1 |
2 | podminka2 |

Pokud pouzijete ten muj vyse uvedeny dotaz, tak db vrati radek v podobe

| nazev1 | nazev2|
| podminka1 | podminka2 |

a to je spravny vysledek.

Ale kdyz pouziteje

SELECT t1.nazev AS nazev1, t2.nazev AS nazev2
FROM tabulka1 AS t1
LEFT JOIN tabulka1 AS t2
on t1.id=t2.id
AND t2.sloupec = 'podminka2'
WHERE t1.sloupec = 'podminka1'

tak db nevrati zadny radek.
Kajman_
Profil *
V prvním selectu máte ON t2.id = t2.id ve druhém on t1.id=t2.id.
Lion76
Profil *
Kajman_

Ano to mate pravdu, ale malicko zapominate na to, ze ten druhy select je Vas.
Kajman_
Profil *
Já jen přepsal jinak Vaše using(id) z prvního příspěvku i dále píšete, že chcete propojit tu tabulku podle id, což se tím právě děje.

Pokud hledáte id splňující obě podmínky, tak žádné takové id tam není. Zkuste si to uvědomit. Pokud chcete něco jiného, tak si uvědomte, že při absenci přesného popisu se nedá radit.
Lion76
Profil *
Kajman_

Ja si to uvedomuji, ale me pripada, ze ted odpovidate aniz by jste si to vyzkousel a zapominate na to, ze i mistr tesar se muze nekdy utnout, tim nemyslim nic zleho, protoze chci se neco dozvedet, co bude pro mne prinosne. Nechci nic jineho, jen chci spojit tabulku samou se sebou spravny zpusobem. A nehledal bych zde absenci, ale radeji bych si to na Vasem miste vyzkousel.

Muj select:
SELECT t1.nazev AS nazev1, t2.nazev AS nazev2 FROM tabulka1 AS t1 LEFT JOIN tabulka1 AS t2 ON t2.id = t2.id WHERE t1.sloupec = 'podminka1' AND t2.sloupec = 'podminka2'

Vas select:
SELECT t1.nazev AS nazev1, t2.nazev AS nazev2
FROM tabulka1 AS t1
LEFT JOIN tabulka1 AS t2
on t1.id=t2.id
AND t2.sloupec = 'podminka2'
WHERE t1.sloupec = 'podminka1'

Muj select vypise spravny vysledek:

| nazev1 | nazev2 |
|podminka1 | podminka2 |

Vas select vypise nespravny vysledek:

| nazev1 | nazev2 |
| podminka1 | NULL |

Pracovalo se s daty zde uvedenymi a tudiz nebyla zjistena zadna absence, protoze kdyby byla, tak by oba selecty zde uvedene vratily chybovou hlasku, ale nevratily, protoze vratily vysledek, ale rozdilny. Proc?
Kajman_
Profil *
To je fakt záhada, že když dáte jinou podmínku, budou jiné výsledky ;-)

Ten druhý hledá stejná id splňující obě podmínky. Ten první jakékoliv dvě id, protože tam máte nesmyslnou podmínku t2.id = t2.id.

A jasně, že jsem to nezkoušel. Nemám potřebu, mně to chování připadá očekávané a správné.
Alphard
Profil
Lion76
když se do této diskuze připojím

on t2.id = t2.id
je nesmyslné, spusť si to bez where, měl by jsi dostat něco jako
| podminka1 | podminka1 |
| podminka1 | podminka2 |
| podminka2 | podminka1 |
| podminka2 | podminka2 |
tedy nedojde ke spojení podle id, ale prostě se vše nakombinuje

where pak jen omezí sadu výsledků
Lion76
Profil *
Kajman_

Podminka spojovaci a podminka omezovaci je velky rozdil, pokud chcete, aby Vam nekdo druhy rozumel, musite byt ve svych reakci vice objektivni, pokud se rozhodnete nekomu pomoct, protoze stejne jako Vy, tak i on nema v ruce kristalovou kouli. ;-)

Dekuji za vysvetleni.

Hmm, stacilo rict, wole pridej si tam dalsi sloupecek a bude Ti to fungovat.

Dekuji za Vas cas.
Lion76
Profil *
Alphard

Ano muzes, ale uz je to vyresene. O tom, ze ta podminka je nesmyslna, jsem vedel, ale takto to fungovalo a ja jsem chtel vedet, proc ta nesmyslna podminka funguje a spravna podminka nefunguje.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0