Toon posts:

[sql] order by doet ie niet goed

Pagina: 1
Acties:

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT 
        nieuws_berichten.id AS zinloosid, 
        nieuws_berichten.naam, 
        nieuws_berichten.datum, 
        nieuws_berichten.nieuwsid, 
        nieuwss.titel, 
        nieuwss.id
FROM 
        nieuws_berichten
LEFT JOIN 
        nieuwss 
ON 
        nieuws_berichten.nieuwsid = nieuwss.id
GROUP BY 
    nieuwss.titel
ORDER BY 
    nieuws_berichten.datum
LIMIT 0,10
DESC

(let op, nieuwss is expres met 2 ss'en.)

Als ik de group by weghaal, dan doet ie het goed, echter staan er dan dubbele titels in. Daarvoor gebruik ik group by. Echter pakt hij hierdoor de nieuws_berichten.datum de jongste datum in plaats van de oudste (nieuwste).

Ik kom er helemaal niet meer uit, wie heeft een tip?

[ Voor 3% gewijzigd door Verwijderd op 08-04-2004 16:18 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Wat staat die group daar te doen?
Je maakt nergens gebruik van aggregated functions, dus moet je ook niet groupen.
Je moet enkel groupen als je functies zoals MIN, MAX, .... gebruikt, en dan moet je groupen op alle velden uit je select list die geen aggregated functie zijn.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Uhhh wil je dat nog even uitleggen.... ik weet niet zo heel veel van sql en wat je nu zegt snap ik niet helemaal... :)

Die group by is om te voorkomen dat er dubbele titels in de lijst komen, group by moet dus weg als ik je goed begrijp, maar hoe los ik het verhaal met de dubbele titels dan op?

Verwijderd

Verwijderd schreef op 08 april 2004 @ 16:22:
Uhhh wil je dat nog even uitleggen.... ik weet niet zo heel veel van sql en wat je nu zegt snap ik niet helemaal... :)

Die group by is om te voorkomen dat er dubbele titels in de lijst komen, group by moet dus weg als ik je goed begrijp, maar hoe los ik het verhaal met de dubbele titels dan op?
1 woord......DISTINCT

Verwijderd

Topicstarter
Verwijderd schreef op 08 april 2004 @ 16:25:
[...]


1 woord......DISTINCT
Distinct werkt dus niet, dat had ik als eerste al gedaan. Maar dat werkte niet zover ik kon uitzoeken omdat distinct alleen werkt als je uit 1 tabel select.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Een group by heb je enkel nodig als je gebruik maakt van functies zoals MAX, MIN, AVG, etc...
bv:
code:
1
select max(id), naam from tabel group by naam

Hiermee krijg je het hoogste id per verschillende naam terug.

In jouw geval moet je je eens afvragen welke waarden voor 'naam', 'datum', etc.... je wilt terugkrijgen als je de dubbele titels eruit wilt halen.

Je moet ook in je achterhoofd houden dat SQL bedoeld is om data mee te selecteren en te manipuleren; de layout en verzorging van de output moet je niet met SQL doen.

DISTINCT werkt op recordniveau (en dat heeft niets te maken met joins). Een DISTINCT haalt de dubbele records eruit, en kijkt dus niet naar dubbele velden.

[ Voor 13% gewijzigd door whoami op 08-04-2004 16:27 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik wil gewoon de toegevoegde nieuws_berichten hebben aan de hand van nieuws_berichten.datum. Daarbij heb ik ook de titel nodig van het nieuwsbericht, welke weer i nde tabel nieuwss staat. En daarom de left join. Echter komt het voor dat er meerdere nieuws_berichten van dezelfde nieuwss.titel zijn, en dan wil ik eigenlijk alleen de laatst toegevoegde nieuws_berichten hebben. Het maximaal aantal regels dat ik terug wil hebben is 10.

Hoop dat ik het zo duidelijk omschrijf...

[ Voor 8% gewijzigd door Verwijderd op 08-04-2004 16:30 ]


  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 23:18

ripexx

bibs

Verwijderd schreef op 08 april 2004 @ 16:25:
[...]

Distinct werkt dus niet, dat had ik als eerste al gedaan. Maar dat werkte niet zover ik kon uitzoeken omdat distinct alleen werkt als je uit 1 tabel select.
Sinds wanneer werkt DISTINCT niet meer, kijk eens goed hoe die moet worden toegepast en in mysql kun je ook DISTINCT ROW gebuiken ;)

buit is binnen sukkel


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Je query is goed (zonder die group by dan); echter, je zult je layout in je presentatie-logica moeten verzorgen (in je PHP/ASP/Delphi/C++/whatever applicatie dus).

https://fgheysels.github.io/


Verwijderd

je kan geen GROUP BY en ORDER BY tegelijk gebruiken...

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Verwijderd schreef op 08 april 2004 @ 16:33:
je kan geen GROUP BY en ORDER BY tegelijk gebruiken...
Dat is onzin.
ripexx schreef op 08 april 2004 @ 16:31:
[...]

Sinds wanneer werkt DISTINCT niet meer, kijk eens goed hoe die moet worden toegepast en in mysql kun je ook DISTINCT ROW gebuiken ;)
DISTINCT werkt wel, maar op een deftig DBMS (ik weet dus niet hoe het in mySQL zit) filtert ie er enkel de unieke 'rows' uit, en kan je dat niet op veld-niveau gebruiken. (Wat eigenlijk best logisch is, welke waarden moeten er anders getoond worden voor de velden waarop je niet DISTINCT wilt selecteren ? )

[ Voor 63% gewijzigd door whoami op 08-04-2004 16:35 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 08 april 2004 @ 16:31:
Je query is goed (zonder die group by dan); echter, je zult je layout in je presentatie-logica moeten verzorgen (in je PHP/ASP/Delphi/C++/whatever applicatie dus).
Maar het is toch onzinnig lastig om met een if statement te checken of mysql een dubbele titel terug geeft? Dan moet je weer apart gaan bijhouden welke titels er al zijn geweest. Kan dat echt niet handiger?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Nee hoor, je moet het ook zo niet doen.
Laat je query die rows teruggeven gesorteert op titel-id, en dan kan je zo checken:

pseudo-code
code:
1
2
3
4
5
6
7
8
9
10
while( NogRows )
{
   oldTitelId = currentRow.TitelId;
   print_titel();
   while( oldTitelId == currentRow.TitelId )
   {
       print_naam();
       get_next_row();
   }
}

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 08 april 2004 @ 16:37:
Nee hoor, je moet het ook zo niet doen.
Laat je query die rows teruggeven gesorteert op titel-id, en dan kan je zo checken:

pseudo-code
code:
1
2
3
4
5
6
7
8
9
10
while( NogRows )
{
   oldTitelId = currentRow.TitelId;
   print_titel();
   while( oldTitelId == currentRow.TitelId )
   {
       print_naam();
       get_next_row();
   }
}
En dan moet je alles weer apart gaan sorteren op datum?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Je kan toch op meerdere velden sorteren ?
ORDER BY titelid, datum.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 08 april 2004 @ 16:43:
Je kan toch op meerdere velden sorteren ?
ORDER BY titelid, datum.
ok ik ga ff proberen... blijf 't vreemd vinden dat je sql niet kunt vertellen geen dubbele velden te geven... maar je zal ongetwijfeld gelijk hebben :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Verwijderd schreef op 08 april 2004 @ 16:44:
[...]

ok ik ga ff proberen... blijf 't vreemd vinden dat je sql niet kunt vertellen geen dubbele velden te geven... maar je zal ongetwijfeld gelijk hebben :)
Je kan 'm zeggen dat hij geen dubbele rijen moet teruggeven.
Maar als jij nu zegt, geef mij alle rijen, maar ik wil geen rijen met dubbele waarden voor titel; wat moet hij dan doen met die andere velden? Wat moet hij dan returnen voor naam enzo ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 08 april 2004 @ 16:47:
[...]


Je kan 'm zeggen dat hij geen dubbele rijen moet teruggeven.
Maar als jij nu zegt, geef mij alle rijen, maar ik wil geen rijen met dubbele waarden voor titel; wat moet hij dan doen met die andere velden? Wat moet hij dan returnen voor naam enzo ?
Nee dan moet ie niks doen...

Verwijderd

Topicstarter
whoami schreef op 08 april 2004 @ 16:43:
Je kan toch op meerdere velden sorteren ?
ORDER BY titelid, datum.
Dat wil niet echt, want hij doet dan wel de datum goed sorteren waardoor je alles na de 1e weg kunt laten met 't pseudocode voorbeeldje, maar dan staan de titels zelf nog wel in hun eigen volgorde ipv de volgorde van de datum...

Verwijderd

Verwijderd schreef op 08 april 2004 @ 16:49:
[...]

Nee dan moet ie niks doen...
ghehe :) grappig...

Desalwelteplus wil je gewoon een set data terug en liefst goed geordend.
Als je bepaalde velden niet nodig hebt laat ze dan weg. Dan zal je distinct ook werken en ben je van alles af.
Als het jou toch niet uitmaakt wat er in Naam en dergelijke staat dan hoef je die kennelijk ook niet te zien... Wil je ze wel zien dan is het resultaat dus niet dubbele rijen, maar unieke rijen!
Als je slecht in sql bent, jij niet natuurlijk..., dan kun je ook in mssql of in access je query in elkaar slepen en dan uiteindelijk het geproduceerde sqlstatement kopieren plakken. Kortom dat voorkomt een boel ellende denk ik....

Verwijderd

Topicstarter
Verwijderd schreef op 08 april 2004 @ 17:01:
[...]


ghehe :) grappig...

Desalwelteplus wil je gewoon een set data terug en liefst goed geordend.
Als je bepaalde velden niet nodig hebt laat ze dan weg. Dan zal je distinct ook werken en ben je van alles af.
Als het jou toch niet uitmaakt wat er in Naam en dergelijke staat dan hoef je die kennelijk ook niet te zien... Wil je ze wel zien dan is het resultaat dus niet dubbele rijen, maar unieke rijen!
Als je slecht in sql bent, jij niet natuurlijk..., dan kun je ook in mssql of in access je query in elkaar slepen en dan uiteindelijk het geproduceerde sqlstatement kopieren plakken. Kortom dat voorkomt een boel ellende denk ik....
Ik heb wel die naam nodig, alleen heb dit maar 1x nodig.... waarsch is de beste oplossing misschien 2 query's te gebruiken met 1 distinct.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Als ik goed begrijp wat jij zegt dan vraag je iets onmogelijks.
Je hebt bij een bepaald nieuwss record bijvoorbeeld twee nieuws_berichten.
Als je dan zowel nieuwss.titel als nieuws_berichten.naam wilt zien, zul je dus altijd twee records te zien krijgen en daarmee de titel dus ook twee keer.

Dat is nu eenmaal hoe sql werkt. Maar hoe wil je dat dan tonen. Het lijkt me dat je in je applicatie ook op een of andere manier op je titels zult moeten groeperen. Om vervolgens per titel de nieuwsberichten te tonen.

Of zit ik nu op een dwaalspoor?

Never underestimate the power of


Verwijderd

Topicstarter
cameodski schreef op 08 april 2004 @ 17:23:
Als ik goed begrijp wat jij zegt dan vraag je iets onmogelijks.
Je hebt bij een bepaald nieuwss record bijvoorbeeld twee nieuws_berichten.
Als je dan zowel nieuwss.titel als nieuws_berichten.naam wilt zien, zul je dus altijd twee records te zien krijgen en daarmee de titel dus ook twee keer.

Dat is nu eenmaal hoe sql werkt. Maar hoe wil je dat dan tonen. Het lijkt me dat je in je applicatie ook op een of andere manier op je titels zult moeten groeperen. Om vervolgens per titel de nieuwsberichten te tonen.

Of zit ik nu op een dwaalspoor?
nee zo bedoel ik het niet, ik wil als de titel al is geweest het niet nog eens in een record terug zien. Dus ook niet de naam etc.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Dus je wilt wel alle records terugkrijgen, maar alleen bij elke eerste nieuwsbericht wil je de titel zien?

Never underestimate the power of


Verwijderd

Topicstarter
cameodski schreef op 08 april 2004 @ 17:36:
Dus je wilt wel alle records terugkrijgen, maar alleen bij elke eerste nieuwsbericht wil je de titel zien?
Nee, ik wil alleen de records terug krijgen waarbij de titel uniek is. En het veld datum de laatste datum is van de reeks.

Verwijderd

Topicstarter
Voorbeeld:
met mijn 1e query zonder de group by krijg ik dit terug:

code:
1
2
3
4
5
6
7
8
9
10
11
zinloosid  naam  datum  nieuwsid  titel  id  
69 nica 1081440232 1938 Turbo 1938 
68 anne 1081439207 1938 Turbo 1938 
67 nica 1081436507 1914 Mijn verhaal. 1914 
66 cutie 1081435997 1932 Goodbye cruel world 1932 
65 lady 1081435930 1914 Mijn verhaal. 1914 
64 nica 1081435569 1936 uhhhh.... 1936 
63 nica 1081434779 1935 Waar? 1935 
62 Wies 1081433190 1932 Goodbye cruel world 1932 
61 co 1081433047 1936 uhhhh.... 1936 
60 co 1081432951 1932 Goodbye cruel world 1932

Zoals je ziet komen sommige titels vaker voor... wat ik dan wil is dat hij kijkt welke datum het hoogst (oudste) is, en alleen die regel laat zien. In dit geval zou dat dus zo moeten zijn:
code:
1
2
3
4
5
6
zinloosid  naam  datum  nieuwsid  titel  id  
69 nica 1081440232 1938 Turbo 1938 
67 nica 1081436507 1914 Mijn verhaal. 1914 
66 cutie 1081435997 1932 Goodbye cruel world 1932 
64 nica 1081435569 1936 uhhhh.... 1936 
63 nica 1081434779 1935 Waar? 1935

Met die group by is het bijna goed, echter pakt hij in plaats van de hoogste (oudste) datum, de laagste (jongste); dus zo:
code:
1
2
3
4
5
6
zinloosid  naam  datum  nieuwsid  titel  id  
68 anne 1081439207 1938 Turbo 1938 
65 lady 1081435930 1914 Mijn verhaal. 1914 
63 nica 1081434779 1935 Waar? 1935 
61 co 1081433047 1936 uhhhh.... 1936 
60 co 1081432951 1932 Goodbye cruel world 1932

Hoop dat 't probleem nu duidelijker is. (en ja, nieuwsid en id zijn hetzelfde, dit is foutje maar niet relevant tot de vraag).

[ Voor 4% gewijzigd door Verwijderd op 08-04-2004 18:28 ]


  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 14-05 15:52
Met die group by is het bijna goed, echter pakt hij in plaats van de hoogste (oudste) datum, de laagste (jongste);......
De oudste datum is nooit het hoogst.... Zo te zien gebruik je een timestamp en die wordt elke seconde verder in het leven (ahum....) een hoger. dus het hoogste nummer is de meest recente datum/tijd...
Dus als je het oudste bericht wilt hebben moet je min() gebruiken en voor het nieuwste bericht max()...

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT 
        nieuws_berichten.id AS zinloosid, 
        nieuws_berichten.naam, 
        min(nieuws_berichten.datum) as datum, 
        nieuws_berichten.nieuwsid, 
        nieuwss.titel, 
        nieuwss.id
FROM 
        nieuws_berichten
LEFT JOIN 
        nieuwss 
ON 
        nieuws_berichten.nieuwsid = nieuwss.id
GROUP BY 
    nieuwss.titel
ORDER BY 
    nieuws_berichten.datum
LIMIT 0,10
DESC


Zo dan :?

[ Voor 34% gewijzigd door beetle71 op 08-04-2004 18:54 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Verwijderd schreef op 08 april 2004 @ 16:57:
[...]

Dat wil niet echt, want hij doet dan wel de datum goed sorteren waardoor je alles na de 1e weg kunt laten met 't pseudocode voorbeeldje, maar dan staan de titels zelf nog wel in hun eigen volgorde ipv de volgorde van de datum...
Niet als je eerst sorteert op titel, en daarbinnen op datum.

ORDER BY titel_id, datum

Je krijgt dan je records zo terug:
code:
1
2
3
4
5
titelId      titel            naam            datum
1             blaat           melp             01/01/2004
1             blaat           melp2           02/01/2004
2             bliep            bla               01/01/2004
....

Op die manier kan je (mbhv die pseudo-code die ik eerder postte), makkelijk volgende output bekomen:
code:
1
2
3
4
5
blaat
   melp       01/01/2004
   melp2     02/01/2004
bliep
  bla            01/01/2004

[ Voor 15% gewijzigd door whoami op 08-04-2004 19:02 ]

https://fgheysels.github.io/


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
beetle71 schreef op 08 april 2004 @ 18:51:
[...]


De oudste datum is nooit het hoogst.... Zo te zien gebruik je een timestamp en die wordt elke seconde verder in het leven (ahum....) een hoger. dus het hoogste nummer is de meest recente datum/tijd...
Dus als je het oudste bericht wilt hebben moet je min() gebruiken en voor het nieuwste bericht max()...

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT 
        nieuws_berichten.id AS zinloosid, 
        nieuws_berichten.naam, 
        min(nieuws_berichten.datum) as datum, 
        nieuws_berichten.nieuwsid, 
        nieuwss.titel, 
        nieuwss.id
FROM 
        nieuws_berichten
LEFT JOIN 
        nieuwss 
ON 
        nieuws_berichten.nieuwsid = nieuwss.id
GROUP BY 
    nieuwss.titel
ORDER BY 
    nieuws_berichten.datum
LIMIT 0,10
DESC


Zo dan :?
En ik ben erg benieuwd welke naam en welk nieuwsid en zinloosid MySQL nu terug gaat geven.
Reken er in ieder geval op dat het lang niet altijd goed gaat.

Never underestimate the power of


  • Jimbolino
  • Registratie: Januari 2001
  • Laatst online: 26-05 14:31

Jimbolino

troep.com

wij hebben het zo altijd geleerd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT 
        nieuws_berichten.id, 
        nieuws_berichten.naam, 
        min(nieuws_berichten.datum) as datum, 
        nieuws_berichten.nieuwsid, 
        nieuwss.titel, 
        nieuwss.id
FROM 
        nieuws_berichten, 
        nieuwss
WHERE
        nieuwss.id = nieuws_berichten.nieuwsid
ORDER BY 
    nieuws_berichten.datum
LIMIT 0,10
DESC


of slaat deze WHERE helemaal nergens op :)

The two basic principles of Windows system administration:
For minor problems, reboot
For major problems, reinstall


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Jimbolino schreef op 09 april 2004 @ 00:14:
wij hebben het zo altijd geleerd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT 
        nieuws_berichten.id, 
        nieuws_berichten.naam, 
        min(nieuws_berichten.datum) as datum, 
        nieuws_berichten.nieuwsid, 
        nieuwss.titel, 
        nieuwss.id
FROM 
        nieuws_berichten, 
        nieuwss
WHERE
        nieuwss.id = nieuws_berichten.nieuwsid
ORDER BY 
    nieuws_berichten.datum
LIMIT 0,10
DESC


of slaat deze WHERE helemaal nergens op :)
Dat is inderdaad een andere manier om te joinen. Het is een kwestie van smaak.
En omdat ik zelf nog wel eens behoorlijk ingewikkelde (LEFT) JOIN's gebruik, vind ik het gebruik van de JOIN keywords toch overzichtelijker.
Overigens klopt je query niet, maar dat is weer wat anders.

@h3nk: Ik heb er gisteravond nog naar zitten kijken, maar ik kan geen oplossing bedenken zonder subqueries te gebruiken.
Wat wel mogelijk is om eerst iets met een soort tijdelijke tabel te doen waarin je dan per titel de nieuwste datum zet.

Never underestimate the power of


Verwijderd

Topicstarter
Ik heb het opgelost op de volgende manier:
code:
1
2
3
4
if (!in_array($r_nieuws['titel'], $titels)) {
    doeiets();
    array_push($titels, $r_nieuws['titel']);
}

Thx allemaal voor het meedenken!

[ Voor 11% gewijzigd door Verwijderd op 09-04-2004 12:19 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Verwijderd schreef op 09 april 2004 @ 12:18:
Ik heb het opgelost op de volgende manier:
code:
1
2
3
4
if (!in_array($r_nieuws['titel'], $titels)) {
    doeiets();
    array_push($titels, $r_nieuws['titel']);
}

Thx allemaal voor het meedenken!
Ik zou -mocht ik jou zijn- toch nog eens kijken naar het idee dat ik eerder gepost heb ivm het sorteren. Die is nl. veel efficiënter dan hetgeen je nu doet.

https://fgheysels.github.io/

Pagina: 1