Avatar billede totalpc Seniormester
25. juni 2017 - 09:29 Der er 7 kommentarer og
1 løsning

Limit til et svar pr medlemsnr

Hej
Jeg har dette SQL der udtrækker de ti tungeste arter pr medlem, pr år hvor godkendt=1 og rekordliste=0 , men jeg har opdaget at hvis samme medlemsnr opretter en fangst med præcis samme vægt, så kommer begge med. Der må stadig kun være en pr medlem uanset at de har samme vægt. Hvordan løser jeg det?
SELECT a.id,a.medlemsnr,a.navn,a.baadnavn, a.Vaegt maxvaegt
FROM    ct_storfanger_indberetninger a,
        (
        select medlemsnr, art, YEAR(dato) year, godkendt, rekordliste, MAX(vaegt) maxVaegt
        FROM ct_storfanger_indberetninger
        GROUP BY medlemsnr, art, YEAR(dato)
        ) maxArt
        WHERE a.medlemsnr = maxArt.medlemsnr
        AND a.art = maxArt.art
        AND a.vaegt = maxArt.maxVaegt
        AND YEAR(a.dato) = maxArt.year
        AND a.godkendt = maxArt.godkendt
        AND a.art='Slethvar'
        AND YEAR(a.dato)=2017
        AND a.godkendt=1
        AND a.rekordliste=0
        ORDER BY maxvaegt DESC
        LIMIT 10
Avatar billede olsensweb.dk Ekspert
25. juni 2017 - 10:32 #1
uden at kigge ret meget på dit statement, tænker jeg distinct
https://dev.mysql.com/doc/refman/5.7/en/distinct-optimization.html
https://www.w3schools.com/sql/sql_distinct.asp
http://www.mysqltutorial.org/mysql-distinct.aspx

hvis linjerne du kun vil have en af, men det kræver det selected er helt ens, så ikke noget med id
Avatar billede olsensweb.dk Ekspert
25. juni 2017 - 10:37 #2
jeg går ud fra at ct_storfanger_indberetninger er en mapnings tabel, og medlemsnr er en fremmed nøgle

ellers må vi lige have nogle test data
Avatar billede totalpc Seniormester
25. juni 2017 - 11:04 #3
http://sqlfiddle.com/#!9/56373/1
Den skal kun give 1 resultat men giver 2 da vægten er den samme.
Avatar billede olsensweb.dk Ekspert
26. juni 2017 - 20:44 #4
kan du ikke bare bruge min(a.id) ??

SELECT min(a.id),a.medlemsnr,a.navn,a.baadnavn, a.Vaegt maxvaegt
FROM    ct_storfanger_indberetninger a,
        (
        select medlemsnr, art, YEAR(dato) year, godkendt, rekordliste, MAX(vaegt) maxVaegt
        FROM ct_storfanger_indberetninger
        GROUP BY medlemsnr, art, YEAR(dato)
        ) maxArt
        WHERE a.medlemsnr = maxArt.medlemsnr
        AND a.art = maxArt.art
        AND a.vaegt = maxArt.maxVaegt
        AND YEAR(a.dato) = maxArt.year
        AND a.godkendt = maxArt.godkendt
        AND a.art='Slethvar'
        AND YEAR(a.dato)=2017
        AND a.godkendt=1
        AND a.rekordliste=0
        ORDER BY maxvaegt DESC
        LIMIT 10
Avatar billede olsensweb.dk Ekspert
26. juni 2017 - 21:25 #5
når jeg kigger på din tabel ct_storfanger_indberetninger tænker jeg, burde den ikke normaliseres ??

* er navn ikke udledt fra medlemsnr ??, så du burde kunne fjerne collonen navn

* burde art ikke hedde art_id ?? så det er artens id der står der og ikke artens navn.
(her har du allerede lavet tabellen du skal bruge (ct_storfanger_arter) )

* burde baadnavn ikke hedde baad_id ?? så der er bådens id der står der og ikke baadnavn.


så skal der bare joines lidt for at vise navn, artsnavn, baadnavn


CREATE TABLE `ct_storfanger_indberetninger` (
  `id` int(11) NOT NULL,
  `dato` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `medlemsnr` varchar(4) COLLATE utf8_danish_ci DEFAULT NULL, 
  `art_id` int(11) DEFAULT NULL,
  `billede` varchar(100) COLLATE utf8_danish_ci DEFAULT NULL,
  `godkendt` tinyint(1) DEFAULT NULL,
  `vaegt` int(11) DEFAULT NULL,
  `baad_id` int(11) DEFAULT NULL,
  `fdato` varchar(45) COLLATE utf8_danish_ci DEFAULT NULL,
  `laengde` int(11) DEFAULT NULL,
  `rekordliste` tinyint(1) DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;
Avatar billede olsensweb.dk Ekspert
28. juni 2017 - 13:14 #6
er det den rigtige post (id 123 / 126 ) der visses ??
burde det ikke være id 120 ??


her har jeg omskrevet din sql, men den skriver så række 120 ud, som jeg mener er den rigtige
select ct_storfanger_indberetninger.*
FROM ct_storfanger_indberetninger
WHERE ct_storfanger_indberetninger.id IN (
    select id FROM ct_storfanger_indberetninger
    WHERE art = 'skrubbe'
    AND YEAR(dato) = 2017
    AND godkendt=1
    AND vaegt = (
        SELECT MAX(vaegt)
        FROM ct_storfanger_indberetninger
        WHERE YEAR(dato) = 2017
        AND godkendt=1
        AND art = 'skrubbe'
    )
)


lad mig gentage, normaliser din tabel
Avatar billede olsensweb.dk Ekspert
28. juni 2017 - 13:26 #7
glem dette
>er det den rigtige post (id 123 / 126 ) der visses ??
burde det ikke være id 120 ?? <

jeg tester jo på
art = 'skrubbe'
og ikke
art = 'Slethvar'

med Slethvar får vi næsten det sammen resultat,
jeg får id 123, 124, 126, så er det jo bare at bruge limit
Avatar billede totalpc Seniormester
28. juni 2017 - 13:48 #8
Hej
Ja undskyld. Jeg har lige været fraværende.
Jeg ved godt at der kunne være forbedringer i fx en brugertabel, men man vil ikke styre medlemmer ud fra denne databasen. Så det giver de problemer det måtte give. Der kommer ikke meget data.
Jeg har fået lidt hjælp ved siden af også og er kommet frem til dette som ser ud til at give det rigtige:
SELECT a.id,a.medlemsnr,a.navn,a.baadnavn, a.Vaegt maxvaegt
                        FROM ct_storfanger_indberetninger a,(
                        select medlemsnr, art, YEAR(dato) year, fdato, godkendt, rekordliste, MAX(vaegt) maxVaegt, MAX(laengde) maxLaengde
                        FROM ct_storfanger_indberetninger
                        GROUP BY medlemsnr, art, YEAR(dato)
                        ) maxArt
                        WHERE a.medlemsnr = maxArt.medlemsnr
                        AND a.art = maxArt.art
                        AND a.vaegt = maxArt.maxVaegt
                        AND YEAR(a.dato) = maxArt.year
                        AND a.godkendt = maxArt.godkendt
                        AND a.rekordliste = maxArt.rekordliste
                        AND a.laengde = maxArt.maxlaengde
                        AND a.fdato = maxArt.fdato
                        AND a.art='$currentart'
                        AND YEAR(a.dato)=$aarstal
                        AND a.godkendt=1
                        AND a.rekordliste = 0
                        ORDER BY maxvaegt DESC
                        LIMIT 10
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester