Podivná logika WHERE - posuďte
7 příspěvků
Archiv diskusního fóra
Fórum je uzavřené a slouží pouze ke čtení. Některé informace mohou být zastaralé.
-
Dneska jsem objevil zvláštní chování některých MySQL servrů při následujícím dotazu (ten co je na konci) kvůli podmínce ve WHERE. Pohráváním si s AND a OR se dá poměrně složitě docílit správného chování dotazu, ale proč to vlastně nefunguje všude stejně? Zkuste si: CREATE TABLE Users( UserID INT(11) PRIMARY KEY AUTO_INCREMENT, Jmeno VARCHAR(255) ) CREATE TABLE Zaznamy( ID INT PRIMARY KEY AUTO_INCREMENT, User INT(11) UNIQUE KEY, Zprava TEXT ) INSERT INTO Users(UserID,Jmeno) VALUES(1,NULL) INSERT INTO Users(UserID,Jmeno) VALUES(2,'Adam') INSERT INTO Users(UserID,Jmeno) VALUES(3,'Martin') INSERT INTO Zaznamy(User,Zprava) VALUES(2,'AHoJ') INSERT INTO Zaznamy(User,Zprava) VALUES(3,'Nazdar') INSERT INTO Zaznamy(User,Zprava) VALUES(NULL,'To jsem já') (1) SELECT * FROM Users,Zaznamy WHERE User=UserID OR (User=NULL AND UserID=1) Když se na to člověk podívá, mělo by se něco vypsat, že jo. No jo, ale ono se na WZ nic nevypíše. Jak to? Při (2) SELECT * FROM Users,Zaznamy WHERE User=UserID se vypíší dva záznamy. Tak proč se nevypíší v dotazu (1), i když je podmínka splněná pro všechny řádky v tabulce Zaznamy? Kdo to umí vysvětlit? :+)
-
tyjo, tohle je spis kviz jak sql, ne? To prvni where se mi zda uplne nesmyslne. Bud chces navazane zaznamy nebo nesmysly. To druhe je prosty join. Co to ma delat?
-
1) Nastuduj si, jak se pracuje s hodnotami NULL: User IS NULL, nikoli User=NULL http://dev.mysql.com/doc/refman/5.1/en/working-with-null.html 2) Ve sloupci Zaznamy.User je na třetím řádku NULL, takže se nespáruje s žádným záznamem Users.ID. Nevidím nic podivného na logice WHERE.
-
Jo, jasně, jsem to blbě opsal. má být IS NULL. Já jsem to přepisoval, abych udělal jednodušší příklad než jsem měl. Oprava: CREATE TABLE Users( UserID INT(11) PRIMARY KEY AUTO_INCREMENT, Jmeno VARCHAR(255) ) CREATE TABLE Zaznamy( ID INT PRIMARY KEY AUTO_INCREMENT, User INT(11) UNIQUE KEY, Zprava TEXT ) INSERT INTO Users(UserID,Jmeno) VALUES(1,NULL) INSERT INTO Users(UserID,Jmeno) VALUES(2,'Adam') INSERT INTO Users(UserID,Jmeno) VALUES(3,'Martin') INSERT INTO Zaznamy(User,Zprava) VALUES(2,'AHoJ') INSERT INTO Zaznamy(User,Zprava) VALUES(3,'Nazdar') INSERT INTO Zaznamy(User,Zprava) VALUES(NULL,'To jsem já') (1) SELECT * FROM Users,Zaznamy WHERE User=UserID OR (User IS NULL AND UserID=1) Účelem je vypsat záznamy z tabulky jak provázané s tabulkou Users, tak i neprovázané s tabulkou Users. Vtip je v tom, že ty provázané je potřeba využít k zobrazení správného uživatelského jména. Prostě zjednodušený případ z praxe. Kdybych mohl použít UNION, bylo by to bez problémů, ale na některých servrech prostě UNION nejde.
-
no, nechci byt urypany, ale v praxi jsem se s nicim takhle podivnym nesetkal. Vetsinou se neco takoveho jako identifikace nekoho pomoci null nepouziva. Prece jenom je to podivny stav neceho nenaplneneho, nedodelaneho.... A k tomu, co to ma delat. Koukam, ze dve veci. Proc?
-
Ne, jen pro vysvětlení smyslu. NULL znamená prázdné pole záznamu. To má speciální význam. Nepříklad když máte takovouhle tabulku: Angličan Čech Němec ----------------------------- Martin Martin Lenka Lenka Petr Petr Petr A jména Martin a Lenka jsou v jiné tabulce. Když pak chcece takovou vypsat, musíte se vypořádat s tím NULL, aby se vypsaly i tyhle řádky. A vo tom to je. :) Možná bych měl použít JOIN, ale ten jsem ještě úplně nepochopil, tak si ho nastuduju. Ale stejně nevim proč to na každém servru funguje jinak.
-
NULL (hodnota neznama, nebo chybi)