ORDER BY last_online werkt niet door OR clause in LEFT JOIN.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Richard Hansma

Richard Hansma

13/04/2013 13:07:38
Quote Anchor link
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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

Daardoor weet hij niet welke die moet gebruiken. Iemand een idee hoe ik dit kan oplossen?
 
PHP hulp

PHP hulp

22/12/2024 09:05:04
 
- SanThe -

- SanThe -

13/04/2013 13:23:16
Quote Anchor link
Die OR op regel 5 slaat volgens mij nergens op.
Je $_GET zo in de query is vragen om problemen. Zie SQL-Injection.
 
Richard Hansma

Richard Hansma

13/04/2013 13:34:41
Quote Anchor link
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.
Gewijzigd op 13/04/2013 13:35:00 door Richard Hansma
 
Eddy E

Eddy E

13/04/2013 13:35:30
Quote Anchor link
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.
Gewijzigd op 13/04/2013 13:56:29 door Eddy E
 
Erwin H

Erwin H

13/04/2013 14:04:30
Quote Anchor link
Met de volgorde is op zich niets mis. Alleen werkt de OR iets anders dan je denkt. Niet zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
ON friends.friend_inviter
OR friends.friend_accepter =
times.username

maar zo
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
ON friends.friend_inviter = 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'.
 
Richard Hansma

Richard Hansma

13/04/2013 14:24:21
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
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
Gewijzigd op 13/04/2013 14:24:53 door Richard Hansma
 
Erwin H

Erwin H

13/04/2013 14:42:42
Quote Anchor link
Probeer hem eens zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
 
Richard Hansma

Richard Hansma

13/04/2013 15:07:25
Quote Anchor link
Ik heb hem aan de praat gekregen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


Als ik
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
friends.friend_inviter = times.username
    AND friends.friend_accepter = '".$_GET['nick']."'

of
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
friends.friend_accepter = times.username
    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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.