[sql] "Negative" query

Pagina: 1
Acties:

  • Gaafy
  • Registratie: Juli 2001
  • Laatst online: 03-06-2024
Hallo,

Ik ben bezig met een soort "am i hot or not script".
Ik heb twee tabellen:
1) Foto, id ...
2) judge, user, foto

Nu wil ik de nieuwste foto waar de gebruiker nog niet op heeft gestemt, en daar gebruik ik deze query voor:

SELECT * FROM foto LEFT JOIN judge ON foto.id != judge.foto WHERE judge.user = '$HTTP_COOKIE_VARS[userid]' AND foto.public = '2' ORDER BY date DESC LIMIT 0,1

Volgens mij werkt dit echter niet correct, heeft iemand een idee waarom?

Ik gebruik overigens MySQL, en kan dus geen subselects gebruiken.

  • Juup
  • Registratie: Februari 2000
  • Niet online
Moet die WHERE niet voor de LEFT JOIN?
En je hebt vreemde naamkeuze gedaan. Wat is judge?

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 11:18

Dido

heforshe

een join ON A != B :?
dan wil je dus ieder record uit je ene tabel gejoined met ieder record uit je andere tabel, behalve als de sleutels gelijk zijn...

Wat betekent mijn avatar?


  • Gaafy
  • Registratie: Juli 2001
  • Laatst online: 03-06-2024
"judge" is de tabel waarin staat welke user welke foto heeft beoordeeld.

Inmiddels ben ik iets verder:
SELECT foto.* FROM foto LEFT JOIN judge ON foto.id=judge.foto
WHERE judge.foto IS NULL

werkt prima, maar nu wil ik nog dat er alleen maar gekeken wordt naar
stemmen die die bepaalde bezoeker heeft uitgebracht.
SELECT foto.* FROM foto LEFT JOIN judge ON foto.id=judge.foto
WHERE judge.user = '2' AND judge.foto IS NULL

En dit werkt niet goed, dan krijg ik geen resultaten.

Voor de duidelijkheid: Bezoekers kunnen stemmen op foto's, en het is de bedoeling dat ze allen foto's krijgen waar
ze nog niet op gestemt hebben.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Waarom gebruik je dan niet gewoon een extra where clause ipv een left join?
code:
1
2
3
4
5
6
SELECT
   meuk
FROM
   table1,table2
WHERE
   table1.iets <> table2.iets

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Gaafy
  • Registratie: Juli 2001
  • Laatst online: 03-06-2024
Daar kom ik ook niet uit.

Dit is de query om de beschikbare foto's te tonen:
SELECT foto.id
FROM foto
WHERE foto.public ='2'

Dit is de query om alle foto's op te halen waar de user op gestemt heeft:
SELECT foto.id
FROM foto, judge
WHERE judge.user ='2'

En nu wil ik allefoto's - gestemde foto's.

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 11:18

Dido

heforshe

En als je die twee dan gewoon combineert: :?
code:
1
2
3
4
5
SELECT foto.id
FROM foto,judge
WHERE foto.id = judge.foto   
  AND foto.public ='2' 
  AND judge.user <> '2'

Wat gaat hier mee mis dan?

Ah. Wacht. Je krijgt dan alleen foto's waarop gestemd is, maar niet door deze user...
[code]
code:
1
2
3
4
5
6
SELECT foto.id
FROM foto,judge
WHERE foto.id = judge.foto   
  AND ( foto.public = '2' 
    AND  judge.user <> '2' )
   OR ISNULL(judge.user)

Wat betekent mijn avatar?


  • Gaafy
  • Registratie: Juli 2001
  • Laatst online: 03-06-2024
Helaas, dit werkt niet...

Iemand die dit wel snapt, en een oplossing weet?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-08 23:12
not exists

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Gaafy
  • Registratie: Juli 2001
  • Laatst online: 03-06-2024
Maar het is PHP, dan kan ik geen subselects gebruiken, hoe gebruik ik dan "not exists"?

Verwijderd

Je kunt geen JOIN maken tussen twee tabellen op basis van het ontbreken van een gerelateerd record. Omdat MySQL geen subqueries ondersteund zul je het dus onders moeten oplossen.

Je zou het volgende kunnen doen.
1) run deze query
code:
1
2
3
SELECT foto
FROM judge
WHERE user = '$HTTP_COOKIE_VARS[userid]'

Nu heb je dus alle ID's van foto's waarop de user gestemd heeft.
2) zet alle ID's van stap 1 in een comma seperated string met een dergelijk effect:
PHP:
1
<?$votedOnPhotos = "1,6,8,6,342,5646,76756765,31231";?>

3) run de volgende query
code:
1
2
3
4
5
6
7
SELECT *
FROM foto
WHERE
   id not in ($votedOnPhotos) AND
   public = '2'
ORDER BY date DESC 
LIMIT 0,1

en je hebt het resultaat wat je zoekt.

HTH :)

  • Gaafy
  • Registratie: Juli 2001
  • Laatst online: 03-06-2024
Dit is een oplossing, maar het is het niet mogelijk om het in één query te doen?

  • Gaafy
  • Registratie: Juli 2001
  • Laatst online: 03-06-2024
Het werkt in ieder geval wel!
Als iemand het in één query kan houd ik mij aanbevolen.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-08 23:12
Op dinsdag 23 juli 2002 18:33 schreef Gaafy het volgende:
Maar het is PHP, dan kan ik geen subselects gebruiken, hoe gebruik ik dan "not exists"?
Daar had ik ff overheen gelezen. Het is dan idd niet mogelijk om not exists te gebruiken.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1