[SQL] laatste reacties lijstje met aantal

Pagina: 1
Acties:

  • fatbenny
  • Registratie: April 2001
  • Laatst online: 07-03-2023
Ik heb een weblog en wil ik graag een lijstje met de laatste reacties laten zien.
1 logs tabel en 1 reacties tabel. In reacties tabel zit verwijzing naar logs.

Dit heb ik nu:
SELECT 15 logs.kop, logs.id FROM reacties,logs WHERE actief = TRUE AND reacties.id = logs.id ORDER by reacties.reactieid DESC

Hiermee krijg ik een lijst met alle laatste reacties dus als er 15 keer op log 1 is gereageerd staat de titel van log 1 ook 15x in de lijst. Distinct werkt niet.

Het is de bedoeling dat de laatste logs worden weergegeven waarop is gereageerd inclusief het aantal reacties (dus aantal malen erop gereageerd)

Verwijderd

group by

  • fatbenny
  • Registratie: April 2001
  • Laatst online: 07-03-2023
Maar dan lukt het niet met order by en count en alle waarden die ik op moet halen. ik krijg dan een probleem met de aggregate function.

  • fatbenny
  • Registratie: April 2001
  • Laatst online: 07-03-2023
SELECT TOP 15 logs.kop, logs.id, count(reacties.id) as total FROM reacties, logs WHERE logs.id = reacties.id AND actief = TRUE Group by logs.kop ORDER By reacties.reactieid DESC

geeft foutmelding op logs.id en reacties.reactieid, maar ik heb ze allebei nodig, logs.id om de link te maken en reactieid om te ordenen

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:33
Als je geen group by gebruikt krijg je een probleem met je count en die aggregate function.

Je moet er ook voor zorgen dat de order by clause de laatste clause is in uw select.
Je moet in uw group by clause ook alle velden opnemen die in uw select - clause staan en die geen resultaat van een aggregated functie zijn.

Trouwens, ooit al van de edit-knop gehoord?

https://fgheysels.github.io/


  • fatbenny
  • Registratie: April 2001
  • Laatst online: 07-03-2023
whoami schreef op 19 september 2002 @ 21:37:
Als je geen group by gebruikt krijg je een probleem met je count en die aggregate function.

Je moet er ook voor zorgen dat de order by clause de laatste clause is in uw select.

Trouwens, ooit al van de edit-knop gehoord?
Ik begrijp het niet. De order by clause staat hier toch als laatste. Desc hoort bij de order clause.

edit: oh zo werkt die knop

[ Voor 0% gewijzigd door fatbenny op 19-09-2002 21:40 . Reden: zoeken naar de editknop ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:33
fatbenny schreef op 19 september 2002 @ 21:39:
[...]


Ik begrijp het niet. De order by clause staat hier toch als laatste. Desc hoort bij de order clause.

edit: oh zo werkt die knop


Toen ik die reacti postte, stond uw sql statement er nog niet. (Kijk ook eens naar m'n opmerking ivm die group by).

https://fgheysels.github.io/


Verwijderd

werkt dit???

SELECT TOP 15 logs.kop, logs.id, count(*) as total FROM reacties, logs WHERE logs.id = reacties.id AND actief = TRUE Group by logs.kop,logs.id ORDER By reacties.reactieid DESC

ik snap die eerste SELECT TOP 15 niet helemaal. die ook bij group by zetten

  • fatbenny
  • Registratie: April 2001
  • Laatst online: 07-03-2023
Peddler: zo had ik hem na jullie aanwijzingen ook, maar hij flipt nu op de order by reacties.reactieid. Dit maakt geen deel uit van aggregate function roept ie weer

En wat snap je van de top 15 niet? Dat haalt ie gewoon de eerste 15 resultaten op. Maar dat bedoel je vast niet.

Als ik reacties.reactieid bij de select en bij de group by zet dan krijg ik geen aggregate function fout meer, maar dan worden de resultaten niet meer gegroepeerd en geeft de count overal '1' aan

Verwijderd

das logisch, hij moet groeperen op het id

ooh, de limit.
werkt hij zonder de order by wel dan???

  • fatbenny
  • Registratie: April 2001
  • Laatst online: 07-03-2023
klopt, net zoals de limit, maar die heeft access niet
zonder order by gaat ie goed

Verwijderd

ik heb een tabel met nieuws en een tabel met reacties daarop. in mySQL werkt deze query prima.
SQL: SELECT count(*), news.record_number,news.title from news,news_reactie where news.record_number=news_reactie.record_number group by news.record_number,news.title order by news_reactie.id

bijna hetzelfde als jij wilt bereiken volgens mij.

kun je met access niet de query die werkt invoeren en dan met behulp van de design view sorteren???

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:33
Je kunt slechts op een veld sorteren als dat ook in uw select-list staat. (met als gevolg dat je die ook in uw group-by list moet zetten).

https://fgheysels.github.io/


Verwijderd

whoami schreef op 19 september 2002 @ 22:03:
Je kunt slechts op een veld sorteren als dat ook in uw select-list staat. (met als gevolg dat je die ook in uw group-by list moet zetten).
gebeurd hierin ook niet:
SELECT count(*), news.record_number,news.title from news,news_reactie where news.record_number=news_reactie.record_number group by news.record_number,news.title order by news_reactie.id

  • fatbenny
  • Registratie: April 2001
  • Laatst online: 07-03-2023
whoami schreef op 19 september 2002 @ 22:03:
Je kunt slechts op een veld sorteren als dat ook in uw select-list staat. (met als gevolg dat je die ook in uw group-by list moet zetten).
Dan zie ik op de manier geen oplossing, want als ik hem ook in de group by zet flipt ie
Hardopdenk: Kan ik niet 2 queries en maken en dat die ene de andere aanroept

ff proberen
Verwijderd schreef op 19 september 2002 @ 22:05:

gebeurd hierin ook niet:
SELECT count(*), news.record_number,news.title from news,news_reactie where news.record_number=news_reactie.record_number group by news.record_number,news.title order by news_reactie.id
Het lijkt inderdaad op de structuur van mijn query

SELECT TOP 15 Count(*), logs.Kop, logs.ID
FROM reacties, logs
WHERE logs.id = reacties.id AND logs.actief=True
GROUP BY logs.kop, logs.id
ORDER BY reacties.reactieid

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:33
Hoezo dan flipt hij ?
#define flippen in deze context?

https://fgheysels.github.io/


  • fatbenny
  • Registratie: April 2001
  • Laatst online: 07-03-2023
flipt hij: de resultaten zijn niet meer gegroepeerd op logs.kop en het resultaat van count is overal 1

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:33
Hmm, ja idd. Dan groupeert hij op id en op kop. Waarom wil je eigenlijk sorteren op ID?

https://fgheysels.github.io/


  • fatbenny
  • Registratie: April 2001
  • Laatst online: 07-03-2023
Even opnieuw: dat flippen gebeurt dus als ik reacties.reactieid in de SELECT en de GROUP BY zet (maar geen aggregate function fout):

SELECT TOP 15 Count(*), logs.Kop, logs.ID, reacties.reactieid
FROM reacties, logs
WHERE logs.id = reacties.id AND logs.actief=True
GROUP BY logs.kop, logs.id, reacties.reactieid
ORDER BY reacties.reactieid

Logs.id staat alleen in de GROUP BY omdat er anders sowieso al een aggregate function fout is.
Logs.id wordt in het aspbestand meegegeven als waarde in een link.
Logs.kop wordt weergegeven op de pagina

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:33
[nohtml]
fatbenny schreef op 19 september 2002 @ 22:17:
Even opnieuw: dat flippen gebeurt dus als ik reacties.reactieid in de SELECT en de GROUP BY zet (maar geen aggregate function fout):
Dat is niet flippen, dan gaat hij gewoon gaan grouperen op kop en op id. Aangezien id uniek is, gaat hij voor ieder id een nieuwe rij maken en omdat er per id maar 1 row kan zijn, krijg je ook een count terug van 1.

fatbenny schreef op 19 september 2002 @ 22:17:

SELECT TOP 15 Count(*), logs.Kop, logs.ID, reacties.reactieid
FROM reacties, logs
WHERE logs.id = reacties.id AND logs.actief=True
GROUP BY logs.kop, logs.id, reacties.reactieid
ORDER BY reacties.reactieid

Logs.id staat alleen in de GROUP BY omdat er anders sowieso al een aggregate function fout is.
Logs.id wordt in het aspbestand meegegeven als waarde in een link.
Logs.kop wordt weergegeven op de pagina


Ik snap dan nog altijd niet wat die reacties.reactieid in uw select doet. Die heb je toch niet nodig (behalve dan dat je er op wilt sorteren, maar ik zie daar niet echt het nut van in.

https://fgheysels.github.io/


  • fatbenny
  • Registratie: April 2001
  • Laatst online: 07-03-2023
Nee, hij doet het goed als er op beide, logs.kop en logs.id, wordt gegroepeerd
Als tevens op reacties.reactieid gegroepeerd wordt dan sorteert hij volgens mij op reactie.id en daar is er inderdaad maar 1 van (count = 1)
Ik snap dan nog altijd niet wat die reacties.reactieid in uw select doet. Die heb je toch niet nodig (behalve dan dat je er op wilt sorteren, maar ik zie daar niet echt het nut van in.
Die hoort er ook niet. Dat was alleen om te laten zien dat er dan geen aggregate function fout kwam.

Ik moet dus de titel en de ID van het laatste log hebben waarop gereageerd is met het aantal reacties daarbij gesorteerd op reacties.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:33
fatbenny schreef op 19 september 2002 @ 22:23:
Nee, hij doet het goed als er op beide, logs.kop en logs.id, wordt gegroepeerd
Als tevens op reacties.reactieid gegroepeerd wordt dan sorteert hij volgens mij op reactie.id en daar is er inderdaad maar 1 van (count = 1)


Maar waarom gebruik je die reactieId? Daarnet zei je dat logid wordt doorgegeven naar een andere pagina maar je spreekt nergens van reactieId?

https://fgheysels.github.io/


  • fatbenny
  • Registratie: April 2001
  • Laatst online: 07-03-2023
Er moet worden gesorteerd op reacties.reactieid omdat anders niet de laatste reacties worden weergegeven.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:33
fatbenny schreef op 19 september 2002 @ 22:26:
Er moet worden gesorteerd op reacties.reactieid omdat anders niet de laatste reacties worden weergegeven.


Hmm...
Kun je dan niet de volgende 'work-around' toepassen:

code:
1
2
3
4
select bla, count(*)
from tabel
where tabel.reactieId in (select top 15 reactieId from tabel order by reactieId)
group by

https://fgheysels.github.io/


  • fatbenny
  • Registratie: April 2001
  • Laatst online: 07-03-2023
Dat wordt wel heel traag denk ik. Want je selecteert eerst alle reacties.

Zoiets: (alleen hij voert de order by niet uit)

SELECT Count(*), logs.Kop, logs.id
FROM reacties, logs
WHERE logs.id=reacties.id And logs.actief=True AND logs.kop IN
(SELECT TOP 15 logs.Kop
FROM reacties, logs
ORDER BY reacties.reactieid DESC)
GROUP BY logs.kop, logs.id

Verwijderd

order by moet als laatst

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:33
fatbenny schreef op 19 september 2002 @ 22:40:
Dat wordt wel heel traag denk ik. Want je selecteert eerst alle reacties.

Zoiets: (alleen hij voert de order by niet uit)

SELECT Count(*), logs.Kop, logs.id
FROM reacties, logs
WHERE logs.id=reacties.id And logs.actief=True AND logs.kop IN
(SELECT TOP 15 logs.Kop
FROM reacties, logs
ORDER BY reacties.reactieid DESC)
GROUP BY logs.kop, logs.id


De performance zal idd wel achteruitgaan, maar er wordt wel op PK gezocht, dus dat is redelijk snel.

Je kunt natuurlijk ook eerst een query doen die de 15 laatste reactieid's ophaalt, en die dan in een string zet. Dan gebruik je die string in uw uiteindelijke query in uw where clause.

https://fgheysels.github.io/


Verwijderd

moet mogelijk zijn zonder sub-query.
mijn query werkt wel:
SELECT count(*), news.record_number,news.title from news,news_reactie where news.record_number=news_reactie.record_number group by news.record_number,news.title order by news_reactie.id

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:33
Verwijderd schreef op 19 september 2002 @ 22:49:
moet mogelijk zijn zonder sub-query.
mijn query werkt wel:
SELECT count(*), news.record_number,news.title from news,news_reactie where news.record_number=news_reactie.record_number group by news.record_number,news.title order by news_reactie.id


Is dat in MySQL?

Normaal gezien moet je de column waarop je sorteert ook in de select-list staan hebben, ik weet dat in MySQL niet het geval hoeft te zijn.... (SQL Server wel dacht ik).

https://fgheysels.github.io/


  • fatbenny
  • Registratie: April 2001
  • Laatst online: 07-03-2023
peddler: SELECT count(*), news.record_number,news.title
fatbenny: SELECT TOP 15 Count(*), logs.Kop, logs.ID

peddler: from news,news_reactie where
fatbenny: FROM reacties, logs WHERE

peddler: news.record_number=news_reactie.record_number group by
fatbenny: logs.id = reacties.id AND logs.actief=True GROUP BY

peddler: news.record_number,news.title order by news_reactie.id
fatbenny: logs.kop, logs.id ORDER BY reacties.reactieid

lijkt me inderdaad hetzelfde, maar hier werkt het niet, ik gebruik access, jij?

Verwijderd

MySQL. al een keer gepost.

ps. heb je al met desing view geprobeerd in access??

  • fatbenny
  • Registratie: April 2001
  • Laatst online: 07-03-2023
ja, krijg hetzelfde alleen dan met 40 haakjes eromheen

  • fatbenny
  • Registratie: April 2001
  • Laatst online: 07-03-2023
ik weet het niet meer :(

Verwijderd

laat ik me er dan ook maar s mee gaan bemoeien, zo lastig kan dit toch niet zijn :P
Het is de bedoeling dat de laatste logs worden weergegeven waarop is gereageerd inclusief het aantal reacties (dus aantal malen erop gereageerd)
code:
1
SELECT l.id, l.kop,COUNT(r.id) FROM logs l, reacties r WHERE actief = true AND l.id = r.id ORDER BY r.reactieid DESC LIMIT 15;


nu krijg je als t goed is, de id's en de titels van de laatste 15 logs waar gereageerd is (aangenomen dat 'actief' een veld is van de tabel logs).

nu ga ik nog even irri zijn :P. Waarom l.id = r.id :? Dit lijkt me de ideale plek waar het mis kan gaan ;) Is r.id geen unieke key voor reacties? Kun je je tabelschema's hier niet even dumpen? Ik zou zelf eerder denken dat 'reacties' een veld logid zou bevatten :?

  • fatbenny
  • Registratie: April 2001
  • Laatst online: 07-03-2023
Tabelstructuur:

Logs: ID (PK), kop, tekst, actief
Reacties: ID(verwijzing naar Logs), Naam, Tekst

en jouw oplossing werkt niet, omdat je dan een foutmelding met de aggregate functie krijgt oftewel alles wat je in order by zet moet ook in select staan.

Verwijderd

fatbenny schreef op 20 september 2002 @ 00:15:
Tabelstructuur:

Logs: ID (PK), kop, tekst, actief
Reacties: ID(verwijzing naar Logs), Naam, Tekst
code:
1
SELECT l.id, l.kop,COUNT(r.id) FROM logs l, reacties r WHERE actief = true AND l.id = r.id ORDER BY 3 DESC LIMIT 15;


en werkt dit wel, of kan access geen order by op die manier? Anders zou ik t ook niet weten in 1 query, tenzij je gebruik gaat maken van functies, maar die heeft access dacht ik niet :?

  • fatbenny
  • Registratie: April 2001
  • Laatst online: 07-03-2023
Werkt ook niet ivm met order by, hoe kan ik het best aanpakken met 2 queries dan, want het is een tracker die op elke pagina komt en moet dus niet te zwaar zijn

  • SAiKO
  • Registratie: September 2000
  • Laatst online: 12-05 12:34

SAiKO

Grote Smurf

offtopic:
fatbenny, upload je avatar ff opnieuw aub. Is een bugje met het omzetten naar parse, opnieuw uploaden zou het oplossen. Die kruisjes irriteren me :P

  • fatbenny
  • Registratie: April 2001
  • Laatst online: 07-03-2023
Tabelstructuur:

Logs: ID (PK), kop, tekst, actief
Reacties: ReactieID(PK), ID(verwijzing naar Logs), Naam, Tekst

Het is de bedoeling dat de laatste 15 logs worden weergegeven waarop is gereageerd inclusief het aantal reacties (dus aantal malen erop gereageerd)

Ik gebruik een MS Access DB

Weet iemand hoe ik dit op kan lossen, ik kom er niet uit
Pagina: 1