ORDER BY last_online werkt niet door OR clause in LEFT JOIN.
Beste PHP-ers,
Ik heb een probleem waar ik niet uit kom. Ik ben bezig met een vriendenlijst, welke overigens werkt op het ordenen na.
Naar mijn weten werkt dit niet omdat ik een OR clause in mijn LEFT JOIN heb staan.
Daardoor weet hij niet welke die moet gebruiken. Iemand een idee hoe ik dit kan oplossen?
Ik heb een probleem waar ik niet uit kom. Ik ben bezig met een vriendenlijst, welke overigens werkt op het ordenen na.
Naar mijn weten werkt dit niet omdat ik een OR clause in mijn LEFT JOIN heb staan.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT friends.friend_inviter, friends.friend_accepter, friends.friend_status, times.last_online
FROM friends
LEFT JOIN times
ON friends.friend_inviter
OR friends.friend_accepter =
times.username
WHERE (friends.friend_inviter =
'".$_GET['nick']."'
OR friends.friend_accepter =
'".$_GET['nick']."')
AND friends.friend_status =
'Accepted'
ORDER BY times.last_online
LIMIT 10
FROM friends
LEFT JOIN times
ON friends.friend_inviter
OR friends.friend_accepter =
times.username
WHERE (friends.friend_inviter =
'".$_GET['nick']."'
OR friends.friend_accepter =
'".$_GET['nick']."')
AND friends.friend_status =
'Accepted'
ORDER BY times.last_online
LIMIT 10
Daardoor weet hij niet welke die moet gebruiken. Iemand een idee hoe ik dit kan oplossen?
Die OR op regel 5 slaat volgens mij nergens op.
Je $_GET zo in de query is vragen om problemen. Zie SQL-Injection.
Je $_GET zo in de query is vragen om problemen. Zie SQL-Injection.
Ik weet ook niet of het zo wel kan werken, maar ik zit met het feit dat iemands 'vriend' de inviter óf de accepter kan zijn. Daarvan wil ik graag de last_online tijd.
Wat betreft de injection. Daar ben ik me van bewust, ik heb het alleen nu zo even gauw getypt omdat het niet uitmaakt in deze kwestie.
Wat betreft de injection. Daar ben ik me van bewust, ik heb het alleen nu zo even gauw getypt omdat het niet uitmaakt in deze kwestie.
Gewijzigd op 13/04/2013 13:35:00 door Richard Hansma
1) SELECT
2) FROM
3) LEFT/RIGHT/INNER JOIN
4) WHERE
5) AND / OR / IS (NOT) BETWEEN
6) GROUP BY
7) ORDER BY
8) LIMIT
Probeer deze volgorde eens aan te houden.
2) FROM
3) LEFT/RIGHT/INNER JOIN
4) WHERE
5) AND / OR / IS (NOT) BETWEEN
6) GROUP BY
7) ORDER BY
8) LIMIT
Probeer deze volgorde eens aan te houden.
Gewijzigd op 13/04/2013 13:56:29 door Eddy E
Met de volgorde is op zich niets mis. Alleen werkt de OR iets anders dan je denkt. Niet zo:
maar zo
Het is niet 'dit of dat gelijk aan iets', maar 'dit gelijk aan iets, of dat gelijk aan iets'.
maar zo
Code (php)
1
2
2
ON friends.friend_inviter = times.username
OR friends.friend_accepter = times.username
OR friends.friend_accepter = times.username
Het is niet 'dit of dat gelijk aan iets', maar 'dit gelijk aan iets, of dat gelijk aan iets'.
Bedankt Erwin, dat het op deze manier werkt wist ik niet. Als ik dat verander krijg ik alleen alles dubbel uit de database...
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
SELECT friends.friend_inviter, friends.friend_accepter, friends.friend_status, times.last_online
FROM friends
LEFT JOIN times
ON friends.friend_inviter = times.username
OR friends.friend_accepter = times.username
WHERE (friends.friend_inviter =
'".$_GET['nick']."'
OR friends.friend_accepter =
'".$_GET['nick']."')
AND friends.friend_status = 'Accepted'
ORDER BY times.last_online
LIMIT 10
FROM friends
LEFT JOIN times
ON friends.friend_inviter = times.username
OR friends.friend_accepter = times.username
WHERE (friends.friend_inviter =
'".$_GET['nick']."'
OR friends.friend_accepter =
'".$_GET['nick']."')
AND friends.friend_status = 'Accepted'
ORDER BY times.last_online
LIMIT 10
Gewijzigd op 13/04/2013 14:24:53 door Richard Hansma
Probeer hem eens zo:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
SELECT friends.friend_inviter, friends.friend_accepter, friends.friend_status, times.last_online
FROM friends
LEFT JOIN times ON(
( friends.friend_inviter = times.username
AND friends.friend_accepter = '".$_GET['nick']."' )
OR
( friends.friend_inviter = '".$_GET['nick']."'
AND friends.friend_accepter = times.username )
)
WHERE friends.friend_status = 'Accepted'
ORDER BY times.last_online
LIMIT 10
FROM friends
LEFT JOIN times ON(
( friends.friend_inviter = times.username
AND friends.friend_accepter = '".$_GET['nick']."' )
OR
( friends.friend_inviter = '".$_GET['nick']."'
AND friends.friend_accepter = times.username )
)
WHERE friends.friend_status = 'Accepted'
ORDER BY times.last_online
LIMIT 10
Ik heb hem aan de praat gekregen.
Als ik
of
weghaal uit mijn ON clause geeft hij alles dubbel.
En als ik het weghaal uit mijn WHERE clause, dan krijg ik het niet meer dubbel maar pakt hij ook de friend_status van anderen.
Ik vind het op zich prima zo, aangezien het werkt. Maar het lijkt me zo 'dubbel', ondanks dat het misschien allebei een andere functie heeft.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT friends.friend_inviter, friends.friend_accepter, friends.friend_status, times.last_online
FROM friends
LEFT JOIN times
ON(
( friends.friend_inviter = times.username
AND friends.friend_accepter = '".$_GET['nick']."' )
OR
( friends.friend_accepter = times.username
AND friends.friend_inviter = '".$_GET['nick']."' )
)
WHERE friends.friend_status = 'Accepted'
AND friends.friend_accepter = '".$_GET['nick']."'
OR friends.friend_inviter = '".$_GET['nick']."'
ORDER BY times.last_online
LIMIT 10
FROM friends
LEFT JOIN times
ON(
( friends.friend_inviter = times.username
AND friends.friend_accepter = '".$_GET['nick']."' )
OR
( friends.friend_accepter = times.username
AND friends.friend_inviter = '".$_GET['nick']."' )
)
WHERE friends.friend_status = 'Accepted'
AND friends.friend_accepter = '".$_GET['nick']."'
OR friends.friend_inviter = '".$_GET['nick']."'
ORDER BY times.last_online
LIMIT 10
Als ik
Code (php)
1
2
2
friends.friend_inviter = times.username
AND friends.friend_accepter = '".$_GET['nick']."'
AND friends.friend_accepter = '".$_GET['nick']."'
of
Code (php)
1
2
2
friends.friend_accepter = times.username
AND friends.friend_inviter = '".$_GET['nick']."'
AND friends.friend_inviter = '".$_GET['nick']."'
weghaal uit mijn ON clause geeft hij alles dubbel.
En als ik het weghaal uit mijn WHERE clause, dan krijg ik het niet meer dubbel maar pakt hij ook de friend_status van anderen.
Ik vind het op zich prima zo, aangezien het werkt. Maar het lijkt me zo 'dubbel', ondanks dat het misschien allebei een andere functie heeft.
Gewijzigd op 13/04/2013 15:08:09 door Richard Hansma




