/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
[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





Søg
Reklame
Statistik
Spørgsmål : 177554
Tips : 31968
Nyheder : 719565
Indlæg : 6408857
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste