[MySQL] SELECT DISTINCT

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Liqued
  • Registratie: Februari 2001
  • Laatst online: 29-06-2022
Ik snap er geen snars van. Heb 2 tabellen:
code:
1
2
3
4
5
6
7
8
9
+--------------+ +--------------+
| Posts        | | Onderwerpen  |
+--------------+ +--------------+
| postid       | |  onderwerpid |
| timestamp    | |  naam        |  
| onderwerpid  | |  forumid     |  
| gebruikerid  | +--------------+  
| post         |
+--------------+


Nu wil ik alle onderwerpen met een bepaalde formid laten zien en deze sorteren op de laatste timestamp van de Post van een bepaald onderwerp.

Ik had daarvoor het volgende bedacht
SQL:
1
2
3
4
SELECT DISTINCT o.onderwerpid 
FROM Onderwerpen o, Posts p
WHERE o.forumid = 1 AND o.onderwerpid = p.onderwerpid
ORDER BY p.timestamp


Dit werk helaas niet (sorteerd niet correct) en als ik o.onderwerpid weg haal bij "SELECT DISTINCT o.onderwerpid" en vervang door *, dan geeft ie netzoveel resultaten als dat er posts zijn en dat is natuurlijk niet helemaal de bedoeling.

Acties:
  • 0 Henk 'm!

  • DDemolition
  • Registratie: Augustus 2003
  • Laatst online: 30-09-2024

DDemolition

slopen is mijn lust en leven

Moet je hier geen GROUP BY gebruiken?
Ik doe dit meestal met Access omdat ik niet zo'n SQL goeroe ben :X . Misschien een tip?

[ Voor 16% gewijzigd door DDemolition op 19-10-2005 16:35 ]

Specs: Server, WS boven, WS beneden


Acties:
  • 0 Henk 'm!

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 09:53
DISTINCT verwacht ook 1 variabele: als je DISTINCT(*) doet, dan is alles 'distinct' en zal hij alle rijen teruggeven.

Acties:
  • 0 Henk 'm!

  • Liqued
  • Registratie: Februari 2001
  • Laatst online: 29-06-2022
DDemolition schreef op woensdag 19 oktober 2005 @ 16:34:
Moet je hier geen group by gebruiken?
Ik doe dit meestal met Access omdat ik niet zo'n sql goeroe ben :X . Misschien een tip?
Hoe bedoel je dat dan precies?

Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 17:28
Je onderwerpid komt natuurlijk meerdere keren voor in de table Posts, dus dan is het niet vreemd dat ze zonder DISTINCT meerdere keren voorkomen. Het sorteren gaat hierdoor ook de mist in (van welke post moet de timestamp gebruikt worden? MySQL kan dit niet voor je beslissen)

[ Voor 12% gewijzigd door sig69 op 19-10-2005 16:36 ]

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • Liqued
  • Registratie: Februari 2001
  • Laatst online: 29-06-2022
sig69 schreef op woensdag 19 oktober 2005 @ 16:35:
Je onderwerpid komt natuurlijk meerdere keren voor in de table Posts, dus dan is het niet vreemd dat ze zonder DISTINCT meerdere keren voorkomen. Het sorteren gaat hierdoor ook de mist in (van welke post moet de timestamp gebruikt worden? MySQL kan dit niet voor je beslissen)
Het moet toch mogelijk zijn om de timestamp met de hoogste waarde te nemen en daar de onderwerpen op sorteren. Of heb ik dat nou mis?

Acties:
  • 0 Henk 'm!

  • Niek.NET
  • Registratie: Oktober 2005
  • Laatst online: 09-06 09:26
Distinct lijkt me in dit geval een beetje overbodig. Als ik het goed begrijp is onderwerpid een primary key, deze is dus al uniek.

[ Voor 4% gewijzigd door Niek.NET op 19-10-2005 16:39 . Reden: verkeerde column naam...foutje :) ]


Acties:
  • 0 Henk 'm!

  • jochemd
  • Registratie: November 2000
  • Laatst online: 08-06 13:57

Acties:
  • 0 Henk 'm!

  • Plague
  • Registratie: Januari 2001
  • Niet online
Als je gegevens uit meerdere tabellen wilt hebben (*) moet je een join gebruiken. Even googlen op join mysql en dan kom je er wel :)

Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 17:28
Liqued schreef op woensdag 19 oktober 2005 @ 16:37:
[...]

Het moet toch mogelijk zijn om de timestamp met de hoogste waarde te nemen en daar de onderwerpen op sorteren. Of heb ik dat nou mis?
Ja dat kan.
Het zal wel iets worden als:
SQL:
1
2
3
4
5
SELECT o.onderwerpid, MAX(p.timestamp)
FROM Onderwerpen o, Posts p 
WHERE o.forumid = 1 AND o.onderwerpid = p.onderwerpid 
GROUP BY o.onderwerpID
ORDER BY p.timestamp

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • Liqued
  • Registratie: Februari 2001
  • Laatst online: 29-06-2022
Deze statement werkt, behalve dat ie nog niet de laatste timestamp gebruikt, maar met de eerste postid. (MAX kent ie niet).

SQL:
1
2
3
4
5
6
SELECT * 
FROM Onderwerpen o, Posts p
WHERE o.forumid =1
AND o.onderwerpid = p.onderwerpid
GROUP BY o.onderwerpid
ORDER BY p.timestamp DESC 

[ Voor 9% gewijzigd door Liqued op 19-10-2005 16:55 ]


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 17:28
MySQL kent MAX zeer zeker wel.

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • Niek.NET
  • Registratie: Oktober 2005
  • Laatst online: 09-06 09:26
Idd....

Zie ook hier

Acties:
  • 0 Henk 'm!

  • Liqued
  • Registratie: Februari 2001
  • Laatst online: 29-06-2022
Ja, je hebt gelijk, maar dan zou ik dus wat hier onder staat moeten maken ander dan blijft ie op de post van een onderwerp sorteren. En dat wil dus niet.
SQL:
1
2
3
4
5
SELECT o.onderwerpid, MAX(p.timestamp)
FROM Onderwerpen o, Posts p  
WHERE o.forumid = 1 AND o.onderwerpid = p.onderwerpid  
GROUP BY o.onderwerpid
ORDER BY MAX(p.timestamp) DESC

Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 17:28
Inderdaad. Iets netter zou dan zijn (vind ik):
SQL:
1
2
3
4
5
SELECT o.onderwerpid, MAX(p.timestamp) AS 'blaat'
FROM Onderwerpen o, Posts p  
WHERE o.forumid = 1 AND o.onderwerpid = p.onderwerpid  
GROUP BY o.onderwerpid
ORDER BY 'blaat' DESC

[ Voor 8% gewijzigd door sig69 op 19-10-2005 17:19 ]

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • Liqued
  • Registratie: Februari 2001
  • Laatst online: 29-06-2022
WHOOOOOOOOOOOOOOOHHH!!! Jullie zijn mijn persoonlijke helden :D

Acties:
  • 0 Henk 'm!

  • neographikal
  • Registratie: Januari 2001
  • Niet online
Plague schreef op woensdag 19 oktober 2005 @ 16:39:
Als je gegevens uit meerdere tabellen wilt hebben (*) moet je een join gebruiken. Even googlen op join mysql en dan kom je er wel :)
Hij joined al, maar dan op de oude manier. Misschien is het gelijk handiger voor de TS om de "normale" syntax te gebruiken :)

SQL:
1
2
3
SELECT *
FROM t1
INNER JOIN t2 ON t1.id = t2.id

[ Voor 3% gewijzigd door neographikal op 20-10-2005 10:11 ]

Pagina: 1