Toon posts:

[SQL] Group-BY bij het gebruik van text fields

Pagina: 1
Acties:

Verwijderd

Topicstarter
Omdat mijn vorige topic zo vroeg gesloten werd open ik er maar weer een met een wat duidelijker onderwerp.

Heb de volgende tabel:
Afbeeldingslocatie: http://www.xs4all.nl/~koni2dsl/tabel1.png

Hier staan een hoop records in. O.a. records met meerdere de zelfde 'adviessite' id's. Nu wil ik er voor zorgen dat er een top 10 komt met de laatste adviessites (gesort op 'geplaatst'). Voor zo ver geen probleem.

Echter, als ik wil dat er geen dubbele 'adviessite' in komen te staan, in die top 10, moet ik met Group-BY gaan werken.

Ik had het volgende bedacht:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT     
MAX(Geplaatst) AS Expr1, 
ID, AdviesSite, aangepast, titel, intro, 
img1, img2, img3, img4, img5, dagcommentaar, actief

FROM         

dbo.tblDagcommentaren

GROUP BY 

Geplaatst, ID, AdviesSite, aangepast, 
titel, intro, img1, img2, img3, img4, img5, 
dagcommentaar, actief


Echter, logischerwijs werkt deze string niet, omdat Dagcommentaar een text field is, en actief een true/false field is.

Hoe kan ik er toch voor zorgen dat ik deze 2 kolommen in mijn resultaat krijg?

Alvast bedankt voor de hulp

[ Voor 6% gewijzigd door Verwijderd op 05-08-2004 15:43 ]


Verwijderd

code:
1
2
3
4
5
SELECT adviesSite, MAX(Geplaatst) AS maxplaats 
FROM tblDagcommentaren 
GROUP BY adviesSite 
ORDER BY maxplaats DESC 
LIMIT 10


Het kan zijn dat je van die LIMIT 10 achteraan, TOP 10 aan het begin moet maken...

[ Voor 26% gewijzigd door Verwijderd op 05-08-2004 15:46 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Group by en order by mogen niet in dezelfde query, en bovendien is maxplaats nou in elk record dezelfde waarde...

edit:
Dat van group by en order by in dezelfde query mag in MySQL wel, maar levert alleen maar onzin op waar je nix mee kan. Andere DBMS'en gaan er wel goed mee om.

[ Voor 44% gewijzigd door NMe op 05-08-2004 15:50 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Verwijderd schreef op 05 augustus 2004 @ 15:46:
code:
1
2
3
4
5
SELECT adviesSite, MAX(Geplaatst) AS maxplaats 
FROM tblDagcommentaren 
GROUP BY adviesSite 
ORDER BY maxplaats DESC 
LIMIT 10


Het kan zijn dat je van die LIMIT 10 achteraan, TOP 10 aan het begin moet maken...
Dit werkt idd prima, maar je krijgt als resultaat alleen de kolommen 'adviessite' & 'maxplaats'. Mijn bedoeling is om alle kolommen te kunnen opvragen.

Moet ik dit misschien met een sub query doen?

Resultaat van die jouw query:
Afbeeldingslocatie: http://www.xs4all.nl/~koni2dsl/tabel2.png


edit: is het misschien mogelijk als ik bij de group by clause, iets doe als ISNULL() ?

Edit²:
code:
1
2
3
4
SELECT     TOP 10 AdviesSite, dagcommentaar, MAX(Geplaatst) AS maxplaats
FROM         dbo.tblDagcommentaren
GROUP BY AdviesSite, ISNULL(dagcommentaar, '')
ORDER BY maxplaats DESC

Grrr, dan ziet ie dagcommentaar weer niet als een group by waarde :(

[ Voor 36% gewijzigd door Verwijderd op 05-08-2004 15:58 ]


Verwijderd

Topicstarter
NMe84 schreef op 05 augustus 2004 @ 15:49:
Group by en order by mogen niet in dezelfde query
Ow? Mjaja, zal best...
NMe84 schreef op 05 augustus 2004 @ 15:49:, en bovendien is maxplaats nou in elk record dezelfde waarde...
(ook) onzin

[edit]
In MS-SQL werkt dat ^^^^ iig wel allemaal :)

[ Voor 8% gewijzigd door Verwijderd op 05-08-2004 15:51 ]


Verwijderd

Verwijderd schreef op 05 augustus 2004 @ 15:49:
[...]
Moet ik dit misschien met een sub query doen?
Waarschijnlijk wel. Zoals reeds gezegd in je vorige topic, en schitterend in de FAQ te bewonderen is, moet je de extra kolommen die je wilt ook aggregeren. Dat gaat met textvelden en weet-ik-niet-wat niet echt gemakkelijk worden, nee.

Maar ik denk dat het geen betekenis heeft. Wat wil je dan tonen? Een willekeurig commentaaritem tonen dat verwijst naar één van de laatste 10 adviessites?

Of gewoon de laatste 10 commentaaritems tonen? Maar dan hoef je helemaal niks te doen met die adviessites.

Tja, en als je het allebei wilt doen, dan zul je gewoon twee verschillende queries uit moeten voeren (en ook niks "subquery", dat zijn gewoon gegevens die niet in één keer opgehaald kunnen worden).

edit:
Laat ik het makkelijker stellen: zet voor je (in je hoofd of op papier of in een tekstbestandje, net wat je het fijnstje vindt), welke kolommen jij vindt dat jouw uitvoer moet krijgen (oftewel, in welke details ben je geïnteresseerd).
Dan beslis je welke rijen je in je kolom wilt (hoeveel, welke voorwaarden worden eraan gesteld).
Bepaal dan welke waarde je wilt dat er in elke kolom komt staan (de hoogste dit, de laagste dat, het totaal, "gewoon" de waarde, wat dan ook).
Je kunt nu precies zien wat er geaggreerd moet worden, en je hebt al een goed idee van hoe dit moet gebeuren. Nu kun je de query schrijven.

[ Voor 28% gewijzigd door Verwijderd op 05-08-2004 16:05 ]


Verwijderd

NMe84 schreef op 05 augustus 2004 @ 15:49:
Group by en order by mogen niet in dezelfde query, en bovendien is maxplaats nou in elk record dezelfde waarde...

edit:
Dat van group by en order by in dezelfde query mag in MySQL wel, maar levert alleen maar onzin op waar je nix mee kan. Andere DBMS'en gaan er wel goed mee om.
Eh? Volgens mij niet hoor. Sterker nog, in onze crash-course SQL in het eerste jaar hebben we dit ook gekregen. Er werd zelfs nog aandacht besteed aan welke clause eerst moest (ORDER BY of GROUP BY). En dat zou een zinloze regel geweest zijn als ze niet samen in een query mogen verschijnen.

Um, en nee, maxplaats is niet elke keer dezelfde waarde. maxplaats is telkens de grootste van elke geaggregeerde groep.

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 21-05 21:51

pistole

Frutter

Bekijk het eens simpel.

Maak een query / view die alleen de ID's laat zien van de te tonen sites, en join die view weer op de originele tabel waarin je de relevante kolommen selecteert.

Ik frut, dus ik epibreer


Verwijderd

Topicstarter
Verwijderd schreef op 05 augustus 2004 @ 15:56:
[...]


Waarschijnlijk wel. Zoals reeds gezegd in je vorige topic, en schitterend in de FAQ te bewonderen is, moet je de extra kolommen die je wilt ook aggregeren. Dat gaat met textvelden en weet-ik-niet-wat niet echt gemakkelijk worden, nee.

Maar ik denk dat het geen betekenis heeft. Wat wil je dan tonen? Een willekeurig commentaaritem tonen dat verwijst naar één van de laatste 10 adviessites?

Of gewoon de laatste 10 commentaaritems tonen? Maar dan hoef je helemaal niks te doen met die adviessites.

Tja, en als je het allebei wilt doen, dan zul je gewoon twee verschillende queries uit moeten voeren (en ook niks "subquery", dat zijn gewoon gegevens die niet in één keer opgehaald kunnen worden).
De tabel 'tblDagcommentaren' wil ik uiteindelijk zo gaan koppelen:

Afbeeldingslocatie: http://www.xs4all.nl/~koni2dsl/tabel3.png

Daarom wil ik eerst een goede SQL string hebben om de top 10 dagcommentaren op te halen. Vervolgens kan ik met 'beurssite' ook de gegevens van die beurssite aan koppelen...

Verwijderd

Topicstarter
pistole schreef op 05 augustus 2004 @ 16:01:
Bekijk het eens simpel.

Maak een query / view die alleen de ID's laat zien van de te tonen sites, en join die view weer op de originele tabel waarin je de relevante kolommen selecteert.
Klinkt idd simpel :D eens even proberen...

Verwijderd

Verwijderd schreef op 05 augustus 2004 @ 16:02:
[...]

De tabel 'tblDagcommentaren' wil ik uiteindelijk zo gaan koppelen:

[afbeelding]

Daarom wil ik eerst een goede SQL string hebben om de top 10 dagcommentaren op te halen. Vervolgens kan ik met 'beurssite' ook de gegevens van die beurssite aan koppelen...
Mja, sorry, ik heb nog iets bij mijn post bijge-edit. Je wilt de gegevens zo `koppelen', ok, geen probleem, dat doen we straks met een JOIN.

Maar beslis éérst welke gegevens je wilt zien, en hoe die opgebouwd zijn.

Verwijderd

Topicstarter
Tjonge, dat ik daar niet eerder op gekomen ben! :)

Afbeeldingslocatie: http://www.xs4all.nl/~koni2dsl/tabel4.png

"Q-Stap1_voorpa..." is dus de query die OneOfBorg op het begin al maakte. Deze heb ik met een Join gekoppeld aan de zelfde tabel. Hierdoor werkt het! Vervolgens kan ik weer deze query joinen met de tabel 'tblDagcommentaren'

SUPER!

Bedankt "OneOfBorg" & "pistole" voor jullie hulp!!

[ Voor 17% gewijzigd door Verwijderd op 05-08-2004 16:21 ]


Verwijderd

Dubbele waarden kunnen toch gefilterd worden met distinct?

Het zou dan zo worden:

SELECT DISTINCT MAX(Geplaatst) AS Expr1, ID, AdviesSite, aangepast, titel, intro, img1, img2, img3, img4, img5, dagcommentaar, actief

FROM tblDagcommentaren

GROUP BY adviesSite

LIMIT 10

Verwijderd

Topicstarter
Verwijderd schreef op 05 augustus 2004 @ 16:13:
Dubbele waarden kunnen toch gefilterd worden met distinct?

Het zou dan zo worden:

SELECT DISTINCT MAX(Geplaatst) AS Expr1, ID, AdviesSite, aangepast, titel, intro, img1, img2, img3, img4, img5, dagcommentaar, actief

FROM tblDagcommentaren

GROUP BY adviesSite

LIMIT 10
Met distinct kan je maar één kolom laten weergeven. Dat had dus achteraf ook gekunt jah.

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

Dido

heforshe

Verwijderd schreef op 05 augustus 2004 @ 16:13:
Dubbele waarden kunnen toch gefilterd worden met distinct?
Dubbele rijen wel ja...
Verwijderd schreef op 05 augustus 2004 @ 16:18:
Met distinct kan je maar één kolom laten weergeven.
Oh? da's nieuw ;)

Wat betekent mijn avatar?


Verwijderd

Topicstarter
Als ik nog even op 'me' topic terug mag komen;

[Q-Stap2_voorpagina_dagcommentaren]:
Afbeeldingslocatie: http://www.xs4all.nl/~koni2dsl/tabel4.png
Dát werkt! Nu wil ik echter de dagcommentaren er aan koppelen;

Afbeeldingslocatie: http://www.xs4all.nl/~koni2dsl/tabel1.png
(die tabel dus)

Maar dan krijg ik vrolijk álle dagcommentaren te zien :(. Dit komt denk doordat ik de innerjoin verkeerd doe;

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT     TOP 100 PERCENT 
dbo.[Q-Stap2_voorpagina_dagcommentaren].ID AS Expr1, 
dbo.tblDagcommentaren.*, 
dbo.[Q-Stap2_voorpagina_dagcommentaren].*

FROM         

dbo.tblDagcommentaren 

INNER JOIN

dbo.[Q-Stap2_voorpagina_dagcommentaren] ON 
dbo.tblDagcommentaren.AdviesSite = dbo.[Q-Stap2_voorpagina_dagcommentaren].ID


Hoe kan ik er voor zorgen dat de informatie van 'tblDagcommentaren' bijgevoegd worden bij de Query (stap2)... ? Nu wordt als het waren de tblDagcommentaren gepakt, en worden de resultaten van Q-Stap2(...) bijgevoegd.

Ik hoop niet dat deze topic gesloten gaat worden met van "je dwaald af" oid...

[ Voor 26% gewijzigd door Verwijderd op 05-08-2004 18:28 ]

Pagina: 1