Avatar billede totalpc Seniormester
07. marts 2017 - 20:37 Der er 17 kommentarer og
2 løsninger

Avanceret select - tror jeg

Jeg er ved at lave et system til indrapporteringen af nogle fiske fangster. Jeg har en tabel der hedder:
ct_storfanger_indberetninger
med følgende felter
ID
Dato
Medlemsnr
Navn
Bådnavn
Art
Vægt

Der er 6 forskellige arter. Man kan indveje alle de fisk man har lyst til i hver art, MEN det er kun den tungeste der tæller i hvert art pr medlemsnr.
For hver art får man point fordelt fra 10 til 1 point, med 10 point til den tungeste og så fremdeles nedefter.

Jeg har fået hjælp herinde til første opgave, nemlig at vise stillingen inden for hver art. Dvs finde de 10 tungeste for hver art, men kun den tungeste pr medlemsnr.
SELECT medlemsnr,navn,bådnavn,MAX(vægt) AS maxvaegt
FROM ct-storfanger_indberetninger WHERE art='$currentart'
GROUP BY medlemsnr,navn
ORDER BY maxvaegt DESC
LIMIT 10

Min næste udfordring er så den samlede pointstilling på tværs af alle arter ud fra det med de 10-1 point. Jeg gemmer jo ikke point i tabellen nogle steder, men jeg har en ide om at det kan laves i en select?
Avatar billede acore Ekspert
08. marts 2017 - 08:49 #1
Prøv med

SET @maxp:=10;
SET @point:=@maxp;
SET @prev:='';

SELECT
  medlemsnr,
  SUM(point) AS score
  FROM
  (
    SELECT
      IF (art!=@prev, @point:=@maxp, @point:=@point-1) AS point,
      @prev:=art,
      medlemsnr,
      art,
      maxvaegt
      FROM
      (
        SELECT
          medlemsnr,
          art,
          MAX(vægt) AS maxvaegt
          FROM ct-storfanger_indberetninger
          GROUP BY medlemsnr,art
          ORDER BY art,maxvaegt DESC
      ) l
  ) s
  WHERE point>0
  GROUP BY medlemsnr

Hvis du vil have point fra 20 og med til 1 i stedet for 10, skal du bare ændre værdien af maxp i den første linie. Den tager alle arter med
Avatar billede acore Ekspert
08. marts 2017 - 08:52 #2
Måske du vil tilføje

ORDER BY score DESC

efter sidste linie, for at få dem i rækkefølge
Avatar billede totalpc Seniormester
08. marts 2017 - 19:40 #3
Beklager jeg først har set dine indlæg nu. Troede jeg fik en mail når der kom nu. Nå men jeg får en fejl når jeg kører det.

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '  FROM   (     SELECT       IF (art!=@prev, @point:=@maxp, @point:=@point' at line 3
Avatar billede totalpc Seniormester
08. marts 2017 - 19:52 #4
Næ vent lige...det er åbenbart fordi der kommer nogle tegn med fra kopieringen. Jeg vender tilbage.
Avatar billede acore Ekspert
08. marts 2017 - 21:02 #5
Har testet den - det er ikke sådan en jeg kan skrive uden at teste ;)
Avatar billede totalpc Seniormester
08. marts 2017 - 21:18 #6
Selvfølgelig har du det :) Tusind tak for hjælpen
Avatar billede acore Ekspert
08. marts 2017 - 21:24 #7
Godt det virkede - blev lige nervøs. Den inderste SELECT er den egen. Den næste tilføjer point. Og den sidste tæller dem sammen.
Avatar billede totalpc Seniormester
08. marts 2017 - 21:43 #8
Mange tak. Det virker fint i workbench som sagt, men jeg kan ikke få det til at virke i PHP (under wordpress). Det ved jeg ikke lige om du har en løsning på? (jeg har lige tilføjet et navn og det virker også i workbench)

$samletstilling = $wpdb->get_results( "SET @maxp:=10;
SET @point:=@maxp;SET @prev:='';
SELECT medlemsnr,navn,SUM(point) AS score
FROM (SELECT IF (art!=@prev, @point:=@maxp, @point:=@point-1) AS point,@prev:=art,navn,medlemsnr,art,maxvaegt
FROM (SELECT medlemsnr,navn,art,MAX(vægt) AS maxvaegt FROM ct_storfanger_indberetninger WHERE YEAR(dato)=2017 GROUP BY medlemsnr,art ORDER BY art,maxvaegt DESC) l ) s
WHERE point>0 GROUP BY medlemsnr  ORDER BY score DESC");
Avatar billede acore Ekspert
08. marts 2017 - 22:06 #9
Hver af de 4 linier skal nok "fyres af" i hver sin query. Hvilket interface bruger du?

Danske bogstaver kan være noget rod. Prøv at ændre "vægt" til "vaegt" i tabellen og query'et.
Avatar billede totalpc Seniormester
08. marts 2017 - 22:11 #10
Det prøver jeg lige.
Interface... ææh altså jeg er ved at lave en custom page i wordpress (php). Jeg kan godt hive andre ting ud af databasen fx den query i spørgsmålet, det virker fint. Det virker som om det er de der Set ting den ikke kan lide.
Avatar billede acore Ekspert
08. marts 2017 - 22:17 #11
Prøv at lave en sætning i php for hver SET ogsåen med resten (SELECT...). Post evt din php kode.hvis det driller.
Avatar billede totalpc Seniormester
08. marts 2017 - 22:40 #12
Jamen der er jo egentlig bare dette:

<table style="border:none;background-color:#e0e0eb;">
                                <tr>
                                <td style="border:none;width:25%;background-color:#456789;" colspan="5"><font color="white">Samlet stilling</font></td>
                                </tr>
                               
                                <tr>
                                <td style="border:none;width:25%"><b>Medlemsnr</b></td>
                                <td style="border:none;width:25%"><b>Navn</b></td>
                                <td style="border:none;width:25%"><b>Samlet antal point</b></td>
                                </tr>
                               
                                <?php
                                        $samletstilling = $wpdb->get_results("SET @maxp:=10;
                                        SET @point:=@maxp;
                                        SET @prev:='';
                                        SELECT medlemsnr,navn,SUM(point) AS score
                                        FROM (SELECT IF (art!=@prev, @point:=@maxp, @point:=@point-1) AS point,@prev:=art,navn,medlemsnr,art,maxvaegt
                                        FROM (SELECT medlemsnr,navn,art,MAX(vægt) AS maxvaegt FROM ct_storfanger_indberetninger WHERE YEAR(dato)=2017 GROUP BY medlemsnr,art ORDER BY art,maxvaegt DESC) l ) s
                                        WHERE point>0 GROUP BY medlemsnr  ORDER BY score DESC");
                                        foreach ($samletstilling AS $samlet){
                                ?>
                                <tr>
                                <td style="border:none;width:25%"><?php echo $samlet->medlemsnr ?></td>
                                <td style="border:none;width:25%"><?php echo $samlet->navn ?></td>
                                <td style="border:none;width:25%"><?php echo $samlet->score ?></td>
                                </tr>           

                                <?php
                                }
                                ?>                                   
                                </table>
Avatar billede acore Ekspert
09. marts 2017 - 07:34 #13
Så let, især når man ved det :)
Avatar billede totalpc Seniormester
09. marts 2017 - 09:12 #14
Hey igen
Jeg havde egentlig lavet en ny kommentar men den er åbenbart blevet væk. Jeg skrev at jeg har fundet ud af hvad problemet nok er. Jeg har fundet dette på nettet:

I think you can only pass one statement to get_results(), so you will need to replace your SET variables with the actual values. It should be OK to assign to variables within the SELECT statement, you just can?t SET them ahead of time

Jeg forstår godt hvis du ikke gider bruge mere tid på dette spørgsmål og takker også for din hjælp indtil videre, men jeg er bare "way in over my head" :) Så hvis du nu havde lyst til at vise mig hvordan ovenstående skal implementeres med get_results så vil du simpelthen gøre mit liv så meget nemmere at leve de næste par dage ;)
Avatar billede acore Ekspert
09. marts 2017 - 09:15 #15
Det var noget lignende jeg prøvede at forklare i #11.

Jeg forstår det således, at koden i #12 ikke virker?
Avatar billede totalpc Seniormester
09. marts 2017 - 09:18 #16
Korrekt. Jeg forstår bare ikke hvad du mener i #11
Altså jeg kan ikke omsætte det til kode/implementering.
Og hvis jeg vil trække navn med ud så skal det bare sættes ind sammen med medlemsnr alle steder ik?
Avatar billede acore Ekspert
09. marts 2017 - 13:22 #17
Når du skal tilgå en database i PHP, så skal du vælge et interface. Dvs et API med funktioner, du kan benytte. Det kan fx være mysqli, som beskrevet i http://php.net/manual/en/mysqli.overview.php.

Ovenpå det har wordpress åbenbart deres eget interface ($wpdb->get_results(...) er en del af det.

Uden at kende dette interface, så gætter jeg på:

<table style="border:none;background-color:#e0e0eb;">
                                <tr>
                                <td style="border:none;width:25%;background-color:#456789;" colspan="5"><font color="white">Samlet stilling</font></td>
                                </tr>
                               
                                <tr>
                                <td style="border:none;width:25%"><b>Medlemsnr</b></td>
                                <td style="border:none;width:25%"><b>Navn</b></td>
                                <td style="border:none;width:25%"><b>Samlet antal point</b></td>
                                </tr>
                               
                                <?php
                                      $wpdb->get_results("SET @maxp:=10;");
                                        $wpdb->get_results("SET @point:=@maxp;");
                                        $wpdb->get_results("SET @prev:='';");
                                        $samletstilling = $wpdb->get_results("
                                        SELECT medlemsnr,navn,SUM(point) AS score
                                        FROM (SELECT IF (art!=@prev, @point:=@maxp, @point:=@point-1) AS point,@prev:=art,navn,medlemsnr,art,maxvaegt
                                        FROM (SELECT medlemsnr,navn,art,MAX(vægt) AS maxvaegt FROM ct_storfanger_indberetninger WHERE YEAR(dato)=2017 GROUP BY medlemsnr,art ORDER BY art,maxvaegt DESC) l ) s
                                        WHERE point>0 GROUP BY medlemsnr  ORDER BY score DESC;");
                                        foreach ($samletstilling AS $samlet){
                                ?>
                                <tr>
                                <td style="border:none;width:25%"><?php echo $samlet->medlemsnr ?></td>
                                <td style="border:none;width:25%"><?php echo $samlet->navn ?></td>
                                <td style="border:none;width:25%"><?php echo $samlet->score ?></td>
                                </tr>           

                                <?php
                                }
                                ?>                                   
                                </table>

Det er ikke sikkert, du behøver det (der er noget kludder med " i din kode i #12) og ovenstående er lidt et gæt, men prøv det.
Avatar billede totalpc Seniormester
09. marts 2017 - 14:13 #18
Hold nu kæft mand....så lykkedes det. Der var lige denne der skulle rettes til

DESC"); så virkede det fandme.... Tusind tak mand....du reddede lige hele min dag, aften og nat hehe... jeg takker og bukker mange gange. Vildt fedt! Tak :)
Avatar billede acore Ekspert
09. marts 2017 - 15:10 #19
Dejligt, at du kunne bruge det
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



Seneste spørgsmål Seneste aktivitet
I dag 16:05 win 10 vil ikke boote Af bb69 i Windows
I dag 11:20 Lenovo x390 Af tobberjas i PC
I dag 10:14 Alder i Excel Af Nanarsi i Excel
I dag 09:00 Flere linier på faneblad Af Peder Lund Nielsen i Excel
I går 21:35 Flash Player Af ErikHg i Andet software