Potreboval bych sestavit dotaz a nevim, jak na to, pomuze mi nekdo? Situace je nasledujici:
mam 3 tabulky:
1. uzivatele
2. dokumenty
3. zaznamy
Pokud nektery z uzivatelu potvrdi libovolny dokument z tabulky dokumenty, zapise se do tabulky zaznam zapis s jeho ID, ID dokumentu a dalsimi udaji.
Ja potrebuju sestavit dotaz, ktery zjisti, ktere dokumenty jeste dotycny uzivatele nepotvrdil. Slo by to tak, ze bych jednim dotazem vybral vsechny dokumenty a pak je prochazel a u kazdeho dalsim dotazem overoval, zda existuje zaznam o jeho potvrzeni danym uzivatelem. Pokud ano, nic by se nedelo, pokud ne, vypsal by se nejaky vystup a navysilo vlastni pocitadlo vysledku.
Nicmene tento zpusob se mi nehodi, ponevac bych to potreboval mit vse v jednom dotazu. Vysledky totiz pote strankuju a v tom skripte vyuzivam fce mysql_num_rows($vysledek) a mysql_data_seek($vysledek, ($stranka*$kolik-$kolik))) a to by pak nefungovalo, pokud bych pro celkovy pocet zaznamu pouzival to vlastni pocitadlo.
Nevite nekdo, jak tedy sestavit dotaz typu:
"vyber vsechny dokumenty z tabulky 'dokumenty', kde v tabulce 'zaznamy' neexistuje zaznam o potvrzeni tohoto dokumentu timto uzivatelem"?
predem dikas za kazdou radu
dobrouběž spát a kašli na to:)
select * from dokumenty
where not exists (select * from zaznamy where potvrzeni=ok)
ale jestli to jde v MySQL nevím.
zkusil jsem:
SELECT * FROM dokumenty
WHERE NOT EXISTS
(SELECT * FROM dokumenty, zaznamy WHERE zaznamy.id_dokumentu = dokumenty.id_dokumentu AND zaznamy.id_uzivatele = 'userID')
..vyhodilo mi to ale chybu syntaxe a nevim, kde je tedy chyba :o(
-----------------------------------------
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXISTS (
SELECT *
FROM dokumenty, zaznamy
WHERE ...
-----------------------------------------
Subselecty tahle verze mySQL jeste nezvlada
dobre a jde to nejak obejit?
file:///C:/mysql/Docs/manual_toc.html#Rewriting_subqueries
The queries:
SELECT * FROM t1 WHERE id NOT IN (SELECT id FROM t2);
SELECT * FROM t1 WHERE NOT EXISTS (SELECT id FROM t2 WHERE t1.id=t2.id);
Can be rewritten as:
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.id IS NULL;
Nevim jak to chodí na web zdarma, jak a kam se zadávaj SQL příkazy, a jak to vypadá. Díky za odpověď
1) Založ si příště nový téma, ať to tady je přehlednější
2) Existuje tu nástroj pro správu MySQL "phpMyAdmin" (Administrace/Nastavení/phpMyAdmin)
Add 2):
Za předpokladu, že trochu umíš PHP a SQL
zkusil jsem to tedy pres JOIN, naslednym zpusobem:
SELECT rd2_dokumenty.*
FROM rd2_dokumenty
LEFT JOIN rd2_zaznamy ON rd2_dokumenty.id_dokumentu = rd2_zaznamy.id_dokumentu
WHERE (rd2_zaznamy.id_dokumentu) IS NULL
..to funguje, nicmene... Ja tenhle dotaz vypise vsechny dokumenty, ktere nemaji v tabulce rd2_zaznamy zadny zaznam. Ja vsak potrebuji, aby mi to vypsalo dokumenty, ktere nemaji v tabulce rd2_zaznamy zaznam od KONKRETNIHO UZIVATELE. Myslel jsem, ze bude stacit mirne pozmenit dotaz na:
SELECT rd2_dokumenty.*
FROM rd2_dokumenty
LEFT JOIN rd2_zaznamy ON rd2_dokumenty.id_dokumentu = rd2_zaznamy.id_dokumentu
WHERE (rd2_zaznamy.id_dokumentu AND rd2_zaznamy.id_uzivatele = '$uid') IS NULL
...to ale nefunguje, na tuto podminku uz to nereaguje. Nevite nekdo, jak ji do toho zakomponovat?
ja bych to napsal spis takhle, ale nezkousel sem , jestli to opravdu funguje...
------------------
SELECT rd2_dokumenty.*
FROM rd2_dokumenty
LEFT JOIN rd2_zaznamy ON rd2_dokumenty.id_dokumentu = rd2_zaznamy.id_dokumentu
WHERE rd2_zaznamy.id_dokumentu IS NULL AND rd2_zaznamy.id_uzivatele = '$uid';
tak to, bohuzel, nejde... vysledkem neni zadny vypis
IMHO se ty 2 podminky navzajem vylucuji, takze to ani nikdy nic vypsat nemuze, nevim...
jasně, že se to tluče, ty se musíš ptát na id z tabulky, kde to je, tety rd2_dokumenty ne rd2_zaznamy. Tedy:
SELECT rd2_dokumenty.*
FROM rd2_dokumenty
LEFT JOIN rd2_zaznamy ON rd2_dokumenty.id_dokumentu = rd2_zaznamy.id_dokumentu
WHERE (rd2_zaznamy.id_dokumentu IS NULL) AND (rd2_dokumenty.id_uzivatele = '$uid');
jestli tam nic takového (rd2_dokumenty.id_uzivatele) není, tak to tam bude třeba dodělat.
diky, uz jsem to vyresil nasledovne:
SELECT *
FROM rd2_dokumenty
LEFT JOIN rd2_zaznamy ON (
( rd2_dokumenty.id_dokumentu = rd2_zaznamy.id_dokumentu )
AND
( rd2_zaznamy.id_uzivatele = '$userID' )
)
WHERE (
( (rd2_zaznamy.id_dokumentu) AND (rd2_zaznamy.id_uzivatele = '$userID') ) IS NULL )
AND rd2_dokumenty.stav_dokumentu = '$docState'