Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MySql] DISTINCT werkt niet

Pagina: 1
Acties:
  • 2.116 views sinds 30-01-2008

  • CoiLive
  • Registratie: Maart 2000
  • Laatst online: 24-09 11:00
Owkee. Dit is de Query:
code:
1
2
3
4
5
6
SELECT reacties.plaats_id, reacties.datum,
       users.user_id, users.user_name, users.datejoined, users.geslacht 
FROM reacties, users 
WHERE reacties.plaats = 'prof' AND users.user_id=reacties.plaats_id 
ORDER BY reacties.datum 
DESC LIMIT 3



Dit is de output:
code:
1
2
3
4
plaats_id  datum       user_id  user_name  datejoined  geslacht 
1624       1057787406  1624     Pjetr      1043520811  Man 
1624       1057787051  1624     Pjetr      1043520811  Man 
1632       1057782351  1632     Anna       1043520811  Vrouw


Zoals je kunt zien komt Pjetr (user_name) 2 keer voor. Hij mag dus maar 1 keer voorkomen. HOE doe ik dat. Ik heb al DISTINCT (reacties.plaats_id) geprobeerd, maar dat werk niet. Ook GROUP BY werkt niet, maar ik had al wel begrepen dat ik een DISTINCT moet gebruiken. Maar over distinct kan ik op mysql.org niet de juiste info vinden.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:16

gorgi_19

Kruimeltjes zijn weer op :9

Aangezien de datums verschillen, zijn het in de optiek van MySQL twee verschillende regels.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Dit is toch prima met een GROUP BY op user.user_id op te lossen? :)

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


Verwijderd

Ehmz, ik geloof dat DISTINCT alleen werkt voor een hele rij. Dus in dat geval ben je out of luck ;). Misschien dat UNIQUE iets kan doen, maar volgens mij kan je dat dan weer alleen in je DDL gebruiken van je tabel om aan te geven dat een bepaalde kolom in die tabel uniek moet zijn.

  • Bananeman
  • Registratie: Juli 2000
  • Niet online
http://www.mysql.com/doc/en/DISTINCT_optimisation.html

Dit zegt eigenlijk genoeg:
DISTINCT is converted to a GROUP BY on all columns
Oftewel, DISTINCT gaat per geheel record.

[ Voor 14% gewijzigd door Bananeman op 10-07-2003 17:56 ]

Motor-forum.nl


  • CoiLive
  • Registratie: Maart 2000
  • Laatst online: 24-09 11:00
GROUP BY user.user_id wil niet, dan gooit die de boel door elkaar.

De query is nu zo:
code:
1
2
3
4
5
6
SELECT DISTINCT (reacties.plaats_id), reacties.datum, 
       users.user_id, users.user_name, users.geslacht 
FROM reacties, users 
WHERE reacties.plaats = 'prof' AND users.user_id=reacties.plaats_id 
ORDER BY reacties.datum 
DESC LIMIT 15



Dit is de output:
code:
1
2
3
4
plaats_id  datum       user_id  user_name  geslacht 
1624       1057787406  1624     Pjetr      Man 
1624       1057787051  1624     Pjetr      Man 
1632       1057782351  1632     Anna       Vrouw


Maar nog doet die het niet. Balen....
Iemand misschien een andere oplossing? 8)7

  • CoiLive
  • Registratie: Maart 2000
  • Laatst online: 24-09 11:00
Bananeman2002 schreef op 10 July 2003 @ 17:54:
http://www.mysql.com/doc/en/DISTINCT_optimisation.html

Dit zegt eigenlijk genoeg:


[...]


Oftewel, DISTINCT gaat per geheel record.
Jah... DISTINCT werkt niet... daar was ik al wel achter, maar bedankt, weer wat geleerd :)

Maar dan nog, hoe los ik het op?

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

FiZz schreef op 10 July 2003 @ 18:04:
code:
1
2
3
4
plaats_id  datum       user_id  user_name  geslacht 
1624       1057787406  1624     Pjetr      Man 
1624       1057787051  1624     Pjetr      Man 
1632       1057782351  1632     Anna       Vrouw


Maar nog doet die het niet. Balen....
Iemand misschien een andere oplossing? 8)7
Er is geen oplossing omdat je niet verteld/bedacht hebt wat je wilt.
Die 'dubbele' rij moet weg, maar er is geen dubbele rij.
Op basis van wat moet welke rij weg?

Who is John Galt?


  • GarBaGe
  • Registratie: December 1999
  • Laatst online: 16:20
FiZz schreef op 10 July 2003 @ 18:05:
[...]


Jah... DISTINCT werkt niet... daar was ik al wel achter, maar bedankt, weer wat geleerd :)

Maar dan nog, hoe los ik het op?
Als je de datum kolom laat vallen, ben je klaar...
Hoe moet MySQL immers een DISTINCT of GROUP BY doen, als hij moet "kiezen" tussen 2 verschillende datums ??

Ryzen9 5900X; 16GB DDR4-3200 ; RTX-4080S ; 7TB SSD


  • CoiLive
  • Registratie: Maart 2000
  • Laatst online: 24-09 11:00
Ja ik snap wat jullie bedoelen.

Op basis van de user_id (of plaats_id, want dat is eigenlijk hetzelfde)moet die er 1 laten vervallen.
Maar de OUDSTE moet weg. De nieuwe moet dus blijven staan.

Ik dacht dat MySQL dat wel zou doen als ik DISTINCT (users.user_id) zou doen. Helaas :)

En die datum kan ik niet weghalen uit de rij, want die datum heb ik nodig als output. Maar ik zou dan natuurlijk ook 2 verschillende query's kunnen gebruiken (denk ik), maar ik wou het gewoon in 1 hebben :)

[ Voor 6% gewijzigd door CoiLive op 10-07-2003 18:39 ]


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 15:08

Dido

heforshe

FiZz schreef op 10 juli 2003 @ 18:04:
GROUP BY user.user_id wil niet, dan gooit die de boel door elkaar.
Je moet eens kijken hoe je GROUP BY wel moet gebruiken. Het schijnt een van de moeilijkst te bevatten dingen te zijn in SQL :)
Probeer dit eens:
code:
1
2
3
4
5
SELECT reacties.plaats_id, MIN(reacties.datum), 
       users.user_id, users.user_name, users.geslacht 
FROM reacties, users 
WHERE reacties.plaats = 'prof' AND users.user_id=reacties.plaats_id 
GROUP BY reacties.plaats_id, users.user_id, users.user_name, users.geslacht

Of MAX, afhankelijk van welke datum je wilt.

Wat betekent mijn avatar?


  • CoiLive
  • Registratie: Maart 2000
  • Laatst online: 24-09 11:00
Dido schreef op 10 July 2003 @ 19:00:
[...]

Je moet eens kijken hoe je GROUP BY wel moet gebruiken. Het schijnt een van de moeilijkst te bevatten dingen te zijn in SQL :)
Probeer dit eens:
code:
1
2
3
4
5
SELECT reacties.plaats_id, MIN(reacties.datum), 
       users.user_id, users.user_name, users.geslacht 
FROM reacties, users 
WHERE reacties.plaats = 'prof' AND users.user_id=reacties.plaats_id 
GROUP BY reacties.plaats_id, users.user_id, users.user_name, users.geslacht

Of MAX, afhankelijk van welke datum je wilt.
En dan doet die het nog niet goed. Staat alles toch nog door elkaar.
Ik vind het frustrerend.

Bovenaan (mijn eerste post) kun staat die in de goede volgorde. Alleen komen users er 2 keer in te staan (wel logisch, want hij kan best 2 berichten hebben geplaatste, en elke bericht heeft natuurlijk een andere datum en tijd).

Het enigste wat daarbij nog moet gebeuren is dat die elke user maar 1 keer laat zien ookal heeft hij wel eens 2 berichten achterelkaar gepost. Bleg :)

Zit er nu al 3 dagen mee te klooien. En zo komt de rest van de site natuurlijk niet af. Ik wil DIT goed hebben 8)7


Even voor de duidelijkheid

code:
code:
1
2
3
4
5
6
SELECT DISTINCT (reacties.plaats_id), reacties.datum, 
       users.user_id, users.user_name, users.geslacht 
FROM reacties, users 
WHERE reacties.plaats = 'prof' AND users.user_id=reacties.plaats_id 
ORDER BY reacties.datum 
DESC LIMIT 15



Dit is de output:
code:
1
2
3
4
plaats_id  datum       user_id  user_name  geslacht 
1624       1057787406  1624     Pjetr      Man 
1624       1057787051  1624     Pjetr      Man  <<<<<<<<<
1632       1057782351  1632     Anna       Vrouw


Die met die pijltjes erachter mag NIET weergegeven worden aangezien die user er anders 2 keer instaat. dat is het oudste bericht van die user, dus die mag "weg".

[ Voor 24% gewijzigd door CoiLive op 10-07-2003 19:14 ]


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

FiZz schreef op 10 July 2003 @ 19:11:
En dan doet die het nog niet goed. Staat alles toch nog door elkaar.
Ik vind het frustrerend.
Kom op zeg! Nadenken!
Vergelijk jouw query eens met die van Dido.
Wat ontbreekt er: de order by clausule, die is dus voor de sortering.

Who is John Galt?


  • CoiLive
  • Registratie: Maart 2000
  • Laatst online: 24-09 11:00
justmental schreef op 10 July 2003 @ 20:26:
[...]

Kom op zeg! Nadenken!
Vergelijk jouw query eens met die van Dido.
Wat ontbreekt er: de order by clausule, die is dus voor de sortering.
En die stel ik dan in zodat sorteerd op Datum en dan doet die het nog niet.
Ik ben geen newbe wat MySQL betreft, en had sorteren echt wel toegevoegd.
Dus het nadenken zit wel goed :)

  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

En die stel ik dan in zodat sorteerd op Datum en dan doet die het nog niet.
Wat doet ie dan niet? Krijg je nog steeds dubbele waarden te zien?
Graag wat meer info dan alleen 'hij doet het niet' ;)
(Je moet gewoon zoals Dido e.a. ook al hebben aangegeven, gebruik maken van een GROUP BY statement).

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


  • CoiLive
  • Registratie: Maart 2000
  • Laatst online: 24-09 11:00
Ik heb even een php file gemaakt. Als jullie daar even in willen kijken, misschien wordt mijn bedoeling dan duidelijk.

Het is dus gewoon een systeem die de LAATSTE reacties (dus de nieuwste) in een profiel van iemand moet weergeven. Daar mogen dus niet 2 keer dezelfde persoon in staan. Nou ja, het mag wel, maar dat staat niet zo mooi.

Probleem.php

De gegevens op deze pagina haalt die ook daadwerkelijk meteen uit de database. Dus als jullie sugesties hebben, en ik verander die ook kunnen jullie meteen zien dat er iets niet goed zit. :)

[ Voor 19% gewijzigd door CoiLive op 10-07-2003 22:38 ]


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

code:
1
2
3
4
5
6
7
SELECT reacties.plaats_id, MIN(reacties.datum),
users.user_id, users.user_name, users.geslacht 
FROM reacties, users 
WHERE reacties.plaats = 'prof' AND users.user_id=reacties.plaats_id 
GROUP BY reacties.plaats_id, users.user_id, users.user_name, users.geslacht
ORDER BY MIN(reacties.datum)
DESC LIMIT 5

Who is John Galt?


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 15:08

Dido

heforshe

FiZz schreef op 10 July 2003 @ 22:37:
Ik heb even een php file gemaakt. Als jullie daar even in willen kijken, misschien wordt mijn bedoeling dan duidelijk.
Ziet er toch al goed uit, alleen de datum komt terug als de laagst mogelijk datum, je wilt de hoogst mogelijke hebben. MAX al geprobeerd?

Verder snap ik niet wat je bedoeld met "Het staat door elkaar" want het staat gesorteerd op datum, maar die is 5 keer gelijk.

Het lijkt erop dat er van iedereen een reactie bestaat met een "nuldatum", is dat zo? Zo nee, waar haalt ie dat dan vandaan?

Maar goed, je wilt de hoogste datum hebben, dus zul je sowieso MAX ipv MIN moeten hebben :)

Wat betekent mijn avatar?


Verwijderd

Verwijderd schreef op 10 July 2003 @ 17:44:
Ehmz, ik geloof dat DISTINCT alleen werkt voor een hele rij. Dus in dat geval ben je out of luck ;). Misschien dat UNIQUE iets kan doen, maar volgens mij kan je dat dan weer alleen in je DDL gebruiken van je tabel om aan te geven dat een bepaalde kolom in die tabel uniek moet zijn.
Volgens mij werk DISTINCT voor de geselecteerde velden en DISTINCTROW voor de hele rij

excuse me if I'm wrong :)

Verwijderd

Misschien ligt de oplossing in het eerst genereren van een temporary tabel.
Met de "rangordes erin". Dus user_id en datum dmv een group by. Vervolgens je originele tabel joinen met de temporay table. Mijns inziens krijg je dan wel de correcte tabel. Je hebt dus twee query's nodig ipv een.

Verwijderd

Hé Fizz, ik zit met precies hetzelfde probleem. Ben je er ooit nog uitgekomen? Let us know...

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:14
nice kick.
Nutteloos.

Je kan evengoed een nieuw en duidelijk topic maken waarin je jouw probleem duidelijk (adhv de quickstart) omschrijft.

[ Voor 74% gewijzigd door whoami op 28-10-2003 14:38 ]

https://fgheysels.github.io/

Pagina: 1

Dit topic is gesloten.