Autor Zpráva
pajadvorak
Profil
select * from tabulka1 JOIN tabulka2 on tabulka1.objednavka = tabulka2.objednavka WHERE ...... 

Potřebuji vypsat všechny objednávky z tabulka1 s podmínkou, že číslo objednávky chybí v tabulka2. Rád bych to udělal nějakým jedním dotazem do databáze. Potřebuji, aby byl dotaz rychlý / efektivní a abych to řešil zřejmě JOIN v MySQL, respektive, abych to pak neřešil v PHP, že ty řádky budu breakovat ve while().

Děkuji.
Kajman
Profil
Např. left join na druhou tabulku a díky podmínce ve where, že primární klíč z druhé tabulky je null, vyfiltrujete ty, které se nepodařilo spojit.
pajadvorak
Profil
Kajman:
Paráda. Děkuji.
pajadvorak
Profil
Tak se mi tam vyskytl další problém...

SELECT p.polozka_kod, p.pocet_ks as pocet_ks_obj, p.objednavka FROM prodejna_eshop_polozky_objednavek p LEFT JOIN dodavatele_obj d ON d.objednavka = p.objednavka WHERE p.obchod = 'xxx' AND d.objednavka IS NULL order by p.objednavka DESC

Problém je v tom, když mám několik položek a každá je u jiného dodavatele. Když provedu objednání první položky u prvního dodavatele, tak už se mi nikdy nezobrazí ostatní položky, které potřebuji objednat u druhého dodavatele, protože to vyruší podmínka "d.objednavka IS NULL".

Jakou podmínku tam mám dát, aby mi to zobrazilo všechny neobjednané položky u druhého dodavatele?

Zkoušel jsem podmínky jako "(d.objednavka IS NOT NULL AND dodavatel != '$dodavatel')" nebo "(d.objednavka IS NOT NULL AND d.kod_zbozi IS NULL)". Nic nefunguje.

Děkuji za každo radu. Nevím si s tím rady.
Kajman
Profil
Tu podmínku dáte do toho left joinu...

LEFT JOIN dodavatele_obj d ON d.objednavka = p.objednavka AND d.dodavatel=42
pajadvorak
Profil
Kajman:
Prosím, co ta vaše podmínka má přesně udělat? Bohužel to nefunguje.

Já potřebuji, aby mi to zobrazilo zbylé položky z tabulky prodejna_eshop_polozky_objednavek, které nemají záznam v tabulce dodavatele_obj.

Vstup je tedy:
obj.č. 111, položka 123, dodavatel A
obj.č. 111, položka 156, dodavatel B
obj.č. 111, položka 456, dodavatel A

výstup:
zvolím dodavatel A

zobrazí mi to:
obj.č. 111, položka 123, dodavatel A
obj.č. 111, položka 456, dodavatel A

Provedu objednávku - zápis do tabulky dodavatele_obj.

To vše mi fungovalo. Ale jakmile mám zapsáno a potřebuji objednat další položky, tak mi to nic neukáže, protože to vyruší podmínka "d.objednavka IS NULL".

Já teď potřebuji zvolit dodavatele B a vypsat toto: obj.č. 111, položka 156, dodavatel B.

Když jsem zkoušel váš návrh, nefunguje. Nevím, zda jsem tam udělal chybu, ale myslím, že jste to napsal srozumitelně. Možná je potřeba více úprav.

Děkuji
Kajman
Profil
Myslel jsem, že neprve hledaáte položky, které nemají stanoveného dodavatele.

Potom, že chcete položky, kde není dodavatel B.

Jaké položky tedy hledáte?

Nejlépe, když nachystáte vzorová data na sqlfiddle.com
pajadvorak
Profil
tabulka prodejna_eshop_polozky_objednavek

objednavka - polozka_kod
(1) 194574 - EHSPF18
(2) 194574 - EHKS19275
(3) 194574 - EH1523351

V kódu PHP se podívám ještě do jiné tabulky, jakého dodavatele daná položka má. To by jistě také šlo udělat v rámci jednoho složeného dotazu, ale to je na mě již moc.

A následně zapíšu položky (1) a (2). Ale jakmile chci zobrazit položku (3), která má jiného dodavatele, tak mi to již vyruší podmínka "d.objednavka IS NULL".

Asi by bylo ideální do toho prvního dotazu rovnou zakomponovat, že se podívám do tabulky etim.zbozi, kde si dohledám kód položek a jejich dodavatele a pak s tím teprve budu pracovat dál.

Ale je to pro mě už moc složité.


Kajman:
Tak se omlouvám, ta podmínka přidaná do left joinu funguje. Kolega mi totiž změnil data a já jsem myslel, že to nefunguje. Takže je to v pořádku. Děkuji.

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:

0