10. marts 2021 - 08:18Der er
15 kommentarer og 1 løsning
Får en tilfældig ID
Hej
Jeg har konstrueret denne select:
SELECT id, month(fdato), year(fdato), medlemsnr, navn, art, max(vaegt) from ct_storfanger_indberetninger_copy where YEAR(fdato)=2020 and godkendt=1 and storfanger=1 AND month(fdato) = 3 group by art, medlemsnr
Jeg får det korrekt data, på nær i ID. Der får jeg er tilfældigt. Jeg kan godt se problemet i select'en, men jeg kan ikke finde ud af at løse det. Nogen der kan?
Det jeg så gerne vil have ud er ID på den største vægt, pr art, pr medlemsnr Så i ovenstående vil jeg gerne have dem med * udtrukket. Med min query får jeg sådan set de rigtige data, men med forkert ID. Jeg får nemlig det her ud:
SELECT id, medlemsnr, art, max(vaegt) from ct_storfanger_indberetninger_copy where YEAR(fdato)=2020 and godkendt=1 and storfanger=1 AND month(fdato) = 3 group by art, medlemsnr
id medlemsnr art max(vaegt) 401 29 Laks 12750 399 34 Laks 6420 398 72 Laks 7500 400 2901 Laks 11250
Hvor I kan se at ID for medlemsnr 29 burde være 403 og ikke 401.
SELECT id, medlemsnr, art, max(vaegt) from ct_storfanger_indberetninger_copy where YEAR(fdato)=2020 and godkendt=1 and storfanger=1 AND month(fdato) = 3 group by art, medlemsnr ORDER BY medlemsnr ASC, vaegt DESC
@arne_v Tak for input og jeg kender godt til at der er den forskel på fx MS SQL Server og MySQL. Jeg fik også læst mig til at, som du skriver, at MySQl så vælger en tilfældig (i det her tilfælde) ID.
Men jeg søger hjælp til at lave den forespørgsel uanset hvordan den så ser ud. Jeg kan ikke få noget til at virke. Men det kan vel ikke passe at det ikke kan lade sig gøre?
SELECT * FROM ct_storfanger_indberetninger_copy sfi1 WHERE vaegt = (SELECT MAX(vaegt) FROM ct_storfanger_indberetninger_copy sfi2 WHERE sfi2.id = sfi1.id)
mysql garanterer ikke værdien af felter, der er med i SELECT men ikke med i GROUP BY. Nyere versioner giver fejl, når man prøver, medmindre only-full_group_by er disabled.
I dit tilfælde løser det ingenting. så dit query skal omskrives til fx:
SELECT fisk.id, t.nr, t.art, fisk.vaegt FROM ct_storfanger_indberetninger_copy fisk INNER JOIN ( SELECT nr, art, MAX(vaegt) AS maxvaegt FROM ct_storfanger_indberetninger_copy WHERE YEAR(fdato)=2020 AND godkendt=1 and storfanger=1 AND month(fdato) = 3 GROUP BY nr, art ) t ON fisk.nr = t.nr AND fisk.vaegt = t.maxvaegt;
(ikke testet og der er sikkert fejl i)
Jeg mener bestemt, at problemet har været oppe herinde før, og at arne_v kom med løsningen, men jeg kan ikke lige finde hans post - måske andre kan?
@acore Skulle bare ændre nr til medlemsnr i dit, så virkede det lige ud af boksen. Jeg havde i mellemtiden fået lavet denne som også virker.
select ori.* from (select medlemsnr,max(vaegt) as vaegt from ct_storfanger_indberetninger_copy where storfanger=1 and godkendt =1 and month(fdato)=3 and year(fdato)=2020 group by medlemsnr) as base join ct_storfanger_indberetninger_copy as ori ON base.medlemsnr = ori.medlemsnr and base.vaegt = ori.vaegt
Jeg kan ikke gennemskue om der vil være en forskel i de 2 løsninger, som vil komme til udtryk på et tidspunkt?
(beklager - jeg ikke havde set arne_v's før jeg skrev mit indlæg - han forklarer det jo)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.