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

[MySQL] Group by + Order by

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb al heel wat uurtjes stuk gekeken op dit probleem, en ondanks dat er toch aardig wat informatie en topics op mijn onderwerp zijn, ben ik er na al die uren (zeg gerust een volle dag) niet uit gekomen.

Wat ik wil is volgens mij supersimpel, en ik snap dan ook niet wat ik fout doe en waarom ik er zelf niet uit kom. Kort gesteld: Ik heb 2 tabellen, usergegevens en een tabel met extra usergegevens, waar meerdere rijen per user zijn. Wat ik wil is alle gegevens van de tabel usergegevens selecteren, en de LAATSTE rij (order by datum) met gegevens selecteren van de extra usergegevens.

In eerste instantie dacht ik dat een order by extrausergegevens.date prima zou werken. Dat werkt op zich ook, maar niet meer nadat ik een group by invoeg (die doe ik op usergegevens.id). Dus ik heb ondertussen tig dingen geprobeert, waaronder:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    SELECT 
        usergegevens.gegevensdieikwil, extrausergegevens.gegevensdieikwil, extrausergegevens.date, MAX(extrausergegevens.date)
    FROM 
        usergegevens
    LEFT JOIN
        extrausergegevens
    ON
        usergegevens.id = extrausergegevens.user_id
    GROUP BY
        usergegevens.id
    HAVING
        extrausergegevens.date = MAX(extrausergegevens.date)
    ORDER BY
        usergegevens.id, MAX(extrausergegevens.date) DESC

Deze query geeft ALLEEN de records terug waar maar 1 records in extrausergegevens zit, de rest laat hij niet zien. :?

Haal ik HAVING weg haal, dan grouped hij alles van de eerste tabel keurig maar met de eerste rij van extrausergegevens, bij pakt dus de order niet mee. Wel heeft hij de juiste waarde van MAX(extrausergegevens.date), namelijk die van de laatste rij.

Voeg ik bij HAVING deze laatste waarde in extrausergegevens.date = 'valuevandemax' dan werkt hij goed. Pakt de juiste gegevens van usergegevens EN extrausergegevens. Maar ja, dat gaat natuurlijk niet werken...

Subselects die ik vaak in voorbeelden terug zag lijkt niet te werken, heb ik misschien een oude versie van MySQL? Hoe dan ook, ik kom er niet uit, dus advies is heel erg welkom!

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:54
code:
1
2
3
4
select usergegevens.naam, usergegevens.straat. , max(extrausergegevens.date)
from usergegevens
inner join extrausergegevens on ....
group by usergegevens.naam, usergegevens.straat, ...


Maw: group by op iedere column in je select-list die geen aggregate functie is.
Zie ook : PRG FAQ - Hoe werkt Group by

[ Voor 15% gewijzigd door whoami op 26-10-2007 12:42 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op vrijdag 26 oktober 2007 @ 12:40:
code:
1
2
3
4
select usergegevens.naam, usergegevens.straat. , max(extrausergegevens.date)
from usergegevens
inner join extrausergegevens on ....
group by usergegevens.naam, usergegevens.straat, ...


Maw: group by op iedere column in je select-list die geen aggregate functie is.
Zie ook : PRG FAQ - Hoe werkt Group by
Ook geprobeert. Als ik alles aan de order by toevoeg dan selecteert hij alle rows (dus meerdere rows uit de tabel extrausergegevens). Ondanks mijn having.

Stel ik heb de volgende select:
usergegevens.id, usergegevens.username, extrausergegevens.date, extrausergegevens.ip, MAX(members_users_geolookups.date)
En dan een group by van:
usergegevens.id, usergegevens.username, extrausergegevens.ip
en voor de rest dezelfde query als in mijn openingspost, dan selecteert ie alle rows, en niet meer gegrouped per user (ik wil immers maar 1 row per gebruiker, alleen dan de nieuwste data uit de gejoinde tabel.

[ Voor 18% gewijzigd door Verwijderd op 26-10-2007 13:08 ]


Verwijderd

Topicstarter
Voor de duidelijkheid, de query geeft nu dus:
1 admin 2007-10-14 00:29:20 85.144.213.192 2007-10-14 00:29:20
1 admin 2007-10-06 02:13:36 85.144.213.192 2007-10-06 02:13:36
1 admin 2007-07-14 19:12:03 71.112.225.66 2007-07-14 19:12:03
2 Matjong 2007-10-24 14:39:03 127.0.0.1 2007-10-24 14:39:03
2 Matjong 2007-10-20 04:33:37 85.144.213.192 2007-10-20 04:33:37
etc.
Dat zou moeten zijn:
1 admin 2007-10-14 00:29:20 85.144.213.192 2007-10-14 00:29:20
2 Matjong 2007-10-24 14:39:03 127.0.0.1 2007-10-24 14:39:03
etc.

[ Voor 3% gewijzigd door Verwijderd op 26-10-2007 13:14 ]


Verwijderd

Topicstarter
Ik heb localhost mijn mysql geupdate, en het lijkt erop dat subselects daar nu wel werken (weet niet hoe het met mijn host zit).

Ik heb nu dit en dat geeft de juiste resultaten weer, is dat de meest efficiente manier?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    SELECT 
        members_users.id, members_users.username, members_users_geolookups.date, members_users_geolookups.ip
    FROM 
        members_users
    LEFT JOIN
        members_users_geolookups
    ON
        members_users.id = members_users_geolookups.user_id
    WHERE members_users_geolookups.date = 
        (
        SELECT 
        MAX(members_users_geolookups.date) 
    FROM 
        members_users_geolookups
    WHERE 
        user_id = members_users.id
    ) 
    GROUP BY
        members_users.id, members_users.username, members_users_geolookups.date, members_users_geolookups.ip

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Die group by heb je niet meer nodig.

Who is John Galt?


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

Dido

heforshe

Nee, want je hebt die group by helemaal nergens meer voor nodig, lijkt me ;)

ik moet geen 2 x nadenken, en ik moet sneller typen :X

[ Voor 31% gewijzigd door Dido op 26-10-2007 13:30 ]

Wat betekent mijn avatar?


Verwijderd

Topicstarter
Ow, natuurlijk ja, dat was nog een nutteloos restantje ;)

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:54
Verwijderd schreef op vrijdag 26 oktober 2007 @ 12:52:
[...]

Ook geprobeertd. Als ik alles aan de order by toevoeg dan selecteert hij alle rows (dus meerdere rows uit de tabel extrausergegevens). Ondanks mijn having.
Je moet ook niet alles aan je order by toevoegen, maar aan je group by.
en voor de rest dezelfde query als in mijn openingspost, dan selecteert ie alle rows, en niet meer gegrouped per user (ik wil immers maar 1 row per gebruiker, alleen dan de nieuwste data uit de gejoinde tabel.
Als je meer dan enkel die recentste datum wil uit die extra-gegevens tabel, dan zal je idd met een subquery moeten werken.

[ Voor 32% gewijzigd door whoami op 26-10-2007 13:50 ]

https://fgheysels.github.io/

Pagina: 1