|
| [Mysql] WHERE del bliver ikke overholdt Fra : Morten Winther |
Dato : 21-04-01 22:06 |
|
Jeg har et problem med denne query, da mysql viser alle rækker selvom
linkaccess.access_id er tom.
Problemet opstår mår jeg sætter "AND linkaccess.access_id = 24" på den
sidste join for at den ikke skal lave unødvendige joins.
Hvis jeg fjerner "AND linkaccess.access_id = 24" fra LEFT joinen virker
WHERE delen.
Hvad er det da sker? En where del må da ikke sådan ses bort fra.
SELECT DISTINCT linklist.link_id, linklist.title, linklist.url,
date_format(linklist.last_time,'%d.%m.%y %H:%i') as opdateret,
userlist.user_name as oprettetaf, userlist.user_id as oprettetid,
linklist.owner_id, linkaccess.access_id
FROM linklist
LEFT JOIN userlist ON userlist.user_id = linklist.owner_id
LEFT JOIN linkaccess ON linkaccess.link_id = linklist.link_id AND
linkaccess.access_id = 24
WHERE linkaccess.access_id = 24
/ morten
| |
Nis Jørgensen (22-04-2001)
| Kommentar Fra : Nis Jørgensen |
Dato : 22-04-01 14:52 |
|
On Sat, 21 Apr 2001 23:06:29 +0200, "Morten Winther" <mw@get2net.dk> wrote:
>Jeg har et problem med denne query, da mysql viser alle rækker selvom
>linkaccess.access_id er tom.
>
>Problemet opstår mår jeg sætter "AND linkaccess.access_id = 24" på den
>sidste join for at den ikke skal lave unødvendige joins.
>
>Hvis jeg fjerner "AND linkaccess.access_id = 24" fra LEFT joinen virker
>WHERE delen.
>
>Hvad er det da sker? En where del må da ikke sådan ses bort fra.
>
>SELECT DISTINCT linklist.link_id, linklist.title, linklist.url,
>date_format(linklist.last_time,'%d.%m.%y %H:%i') as opdateret,
>userlist.user_name as oprettetaf, userlist.user_id as oprettetid,
>linklist.owner_id, linkaccess.access_id
>FROM linklist
>LEFT JOIN userlist ON userlist.user_id = linklist.owner_id
>LEFT JOIN linkaccess ON linkaccess.link_id = linklist.link_id AND
>linkaccess.access_id = 24
>WHERE linkaccess.access_id = 24
Hvorfor bruger du "LEFT JOIN" hvis du kun vil have rækker, hvor der er data i
linkaccess-tabellen?
Og hvad er formålet med at angive "linkaccess.access_id = 24" både i
join-udtrykket og where-udtrykket?
Jeg vil tro at problemet skyldes at MySQL ignorerer where-udtrykket, fordi den
er identisk med en del af join-udtrykket. Desværre har join-udtrykket ikke den
tilsigtede virkning. "LEFT JOIN" medfører at du får alle rækker, hvor
join-udtrykket er opfyldt, plus en række for hver post i linklist der ikke har
mindst en post i linkaccess der opfylder join-udtrykket.
--
Med venlige hilsner
Nis Jørgensen, Albertslund
Actual code behavior may differ from intended.
| |
Morten Winther (22-04-2001)
| Kommentar Fra : Morten Winther |
Dato : 22-04-01 17:23 |
|
"Nis Jørgensen" <nis@dkik.dk> wrote in message
news:0on5ets9ppu3joa22b963c9gun73jpu3bs@4ax.com...
> Hvorfor bruger du "LEFT JOIN" hvis du kun vil have rækker, hvor der er
data i
> linkaccess-tabellen?
>
> Og hvad er formålet med at angive "linkaccess.access_id = 24" både i
> join-udtrykket og where-udtrykket?
>
> Jeg vil tro at problemet skyldes at MySQL ignorerer where-udtrykket, fordi
den
> er identisk med en del af join-udtrykket. Desværre har join-udtrykket ikke
den
> tilsigtede virkning. "LEFT JOIN" medfører at du får alle rækker, hvor
> join-udtrykket er opfyldt, plus en række for hver post i linklist der ikke
har
> mindst en post i linkaccess der opfylder join-udtrykket.
Nu var denne query noget jeg havde kogt lidt ned så den ikke var så lang.
Normalt er der flere joins + en længere WHERE del.
Jeg har dog læst at Mysql udfører LEFT joins ved at omforme dem til noget
den sætter i where delen. Det giver en meget god idé til hvorfor det gik
galt, da det må have givet noget dobbelt konfekt.
/ morten
| |
|
|