Autor Zpráva
Monkeys
Profil *
Zdravim

potreboval by som poradit s dotazom:
Chcem aby sa vybrali tabulky takto:
SELECT table1.*, table2.*, table3.* FROM table1 JOIN table2 USING(id_table) JOIN table3 ale obsah tabulky 3 vybrat len ked obsahuje data WHERE table1.id_table=1

da sa to cez 1 dotaz ? alebo musim spravit 2 dotazy

vdaka

M.
Kajman
Profil
Pro tabulku table3 použijte left join a tu podmínku nedávejte do where ale do on u toho joinu.
Monkeys
Profil *
vyriesil som to takto:

SELECT table1.*, table2.*, table3.*, table4.*
FROM table1 LEFT JOIN table2 ON table1.id_table1=table2.id_table2
LEFT JOIN table3 ON table2.id_table2=table3.id_table3
LEFT JOIN table4 ON table4.id_table4=table3.id_table3
WHERE IF(table4.id_table4 IS NOT NULL, table3.id_table3 IS NOT NULL, table4.id_table4 IS NULL)
AND table1.id_table1="'.intval($id).'"

pisem to z hlavy mozno sa stal niekde preklep

M.


este riesim jednu zaludnost

ako aktualizovat tabulku1 na zaklade tabulky2 ktora ma jeden zo stlpcov 0 (nulovy)
a tabulku1 aktualizovat v stlpci neakym stringom.
najlepsie v jednom SQL prikaze neako cez INNER JOIN

M.
Monkeys
Profil *
Chcem sa len opytat ci je realne mozne v jednom UPDATE dotaze aktualizovat na zaklade zaznamov z inej tabulky ?
Riesim to cely den.

a este mam otazku:
Hodnota NULL = 0 alebo NULL = "" (teda prazdny)

dakujem
M.
Tori
Profil
Monkeys:
ako aktualizovat tabulku1 na zaklade tabulky2
Místo jedné tabulky dáte několik a pro aktualizaci vyjmenujete sloupce jen z jedné tabulky, např.

UPDATE t1 LEFT JOIN t2 on t1.id = t2.id_t1 
SET t1.kopirovanySloupec = t2.sloupec, t1.jinySloupec = IFNULL(t2.jinySloupec, '')
Pokud byste potřeboval použít seskupení záznamů (např. v kombinaci s COUNT nebo SUM), musíte to řešit poddotazem - přímo v UPDATE se GROUP BY použít nedá.
Monkeys
Profil *
Tori:
dakujem este predtym ako som si precital vas prispevok som vymyslel nieco taketo myslim ze to splna to co chcem len nemozem to rozbehat :)

$this->database->MyQuery("UPDATE produkt SET dostupnost='Nedostupný', priznaky='Neaktívny' WHERE EXISTS(SELECT skladovost FROM basket WHERE skladovost='0' AND id_basket IN (".implode(",",array_keys(array_map("intval",$_SESSION['kosik']))).")");

mozte mi poradit ?
dakujem

M:
Tori
Profil
Monkeys:
V poddotazu myslím chybí vazba na tab.produktů. Bez toho vám to stejným způsobem updatuje (nebo neupdatuje) všechny řádky v tab.produktů.
Monkeys
Profil *
Tori:
Funguje to
problem bol tu:

$this->database->MyQuery("UPDATE produkt SET dostupnost='Nedostupný', priznaky='Neaktívny' WHERE EXISTS(SELECT skladovost FROM basket WHERE skladovost='0' ) AND id_basket IN (".implode(",",array_keys(array_map("intval",$_SESSION['kosik']))).")");

M.
Monkeys
Profil *
tak Tori: mali ste nakoniec pravdu updatuje mi to vsetky riadky naraz to som zistil az dnes ...
Momentalne to skusam zas takto neako ale tiez bez vysledku.

$update = $this->database->MyQuery("UPDATE produkt LEFT JOIN basket USING(id_basket) 
SET dostupnost='".$this->database->EscapeString($nedostupny)."', priznaky='".$this->database->EscapeString($neaktivny)."'
CASE basket.skladovost
WHEN IS NULL THEN basket.id_basket IN (".implode(",",array_keys(array_map("intval",$_SESSION['kosik']))).")
ELSE ''
END");

Princip je jednoduchy ak sa skladovost dostane na 0 tak chcem zakazat zobrazenie tych produktov ktore sa minuli.
Dakujem za kazdu dobru radu

M.
Monkeys
Profil *
Tak som to vyriesil uz funguje ako ma:
UPDATE produkt JOIN basket USING(id_basket) SET produkt.dostupnost='".$this->database->EscapeString($nedostupny)."', 
produkt.priznaky='".$this->database->EscapeString($neaktivny)."'
WHERE basket.skladovost='0'

len nerozumiem preco nefunguje aj tento zapis

UPDATE produkt JOIN basket USING(id_basket) SET produkt.dostupnost='".$this->database->EscapeString($nedostupny)."', 
produkt.priznaky='".$this->database->EscapeString($neaktivny)."'
WHERE basket.skladovost IS NULL

M.
Tori
Profil
Monkeys:
JOIN == INNER JOIN, takže výsledkem spojení tabulek jsou pouze záznamy, které existují v obou tabulkách. Jestli se nepletu, IS NULL by prošlo v případě, že a) sloupeček skladovost může být nulový a některý záznam tu hodnotu obsahuje, a/nebo b) místo JOIN použijete LEFT JOIN (tj. jako nedostupné se označí i produkty, které nebudou nalezeny v tabulce basket).

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: