Avatar billede madseksperten Nybegynder
05. januar 2016 - 23:20 Der er 4 kommentarer og
1 løsning

retunere tal der mindst gange i en column

Hejsa

Jeg har et formfield hvor jeg kan indtaste et tal mellem 1 - 12. Dette tal bliver gemt i min MySQL database under column navnet numbers.

Jeg har brug for en SQL query, som udskriver de tal som er blevet indtastet mindst gange, og hvor det tal der er indtastet mindst gange er står øverst. Det der er problematikken, som jeg ikke kan hitte ud af, det er at hvis et specifikt tal ikke bliver indtastet overhovedet, så skal dette stå øverst. Det kan sagtens være at ud af 20 terningekast rammer 12 ikke, og dermed skulle 12 så stå øverst. Men dette tal eksisterer jo ikke i databasen.

Jeg har prøvet at lege lidt med denne query:
$stmt = $mysqli->prepare("SELECT numbers FROM numbertable GROUP BY numbers ORDER BY COUNT(*) ASC LIMIT 10;");

men det er ud fra de tal som der bliver indtastet. Denne query tager ikke hensyn til de tal som ikke er indtastet, og dermed det mest "kolde" tal kan man vel kalde det.

Er der nogle som har en ide til hvordan jeg kan løse det?

Mvh Mads
Avatar billede moddi100 Seniormester
06. januar 2016 - 02:05 #1
Utestet, men bør virker:
SELECT tal.number, COUNT(*) as antal FROM
(SELECT 1 number UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12) AS tal LEFT JOIN numbertable ON tal.number=numbertable.numbers GROUP BY tal.number ORDER BY tal.number ASC;
Avatar billede madseksperten Nybegynder
06. januar 2016 - 18:46 #2
Hejsa Moodi.

Jeg er ikke helt med på koden. Hvis du får tid vil du så forklare den? hvad bruges tal.number til?

mvh Mads
Avatar billede moddi100 Seniormester
06. januar 2016 - 23:40 #3
Der er ikke nogen nem måde at hente en række med tal på, hvorfor jeg har lavet følgende forespørgsel til udelukkende at returnere 12 rækker, startende fra 1 til 12:
SELECT 1 number UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12

Du kan se resultatet her:
http://imgur.com/oqg4Ppt

For at kunne referere til den fremadrettet kalder vi feltet for number og tabellen for tal:
SELECT tal.number, COUNT(*) as antal // Se 1

FROM (...) AS tal  // Se 2

LEFT JOIN numbertable ON tal.number=numbertable.numbers // Se 3

GROUP BY tal.number // Se 4

ORDER BY tal.number ASC; // Sortering

Forklaring følger:
1) Count tæller antal rækker med samme nummer
2) Fra "tabellen" tal, som er beskrevet ovenfor. I princippet blot en liste med de 12 tal
3) Fortæller at tabellen med tal og din egen tabel skal knyttes sammen ved de rækker, hvor tallet er ens (i første omgang er tallet 1, næste 2, 3 etc.)
4) For at vi ikke for 7 rækker ud pr tal, men kan anvende COUNT(*)
Avatar billede madseksperten Nybegynder
07. januar 2016 - 18:58 #4
Jeg takker for det fyldestgørende svar. Jeg er kørt lidt død i lige netop dette, så jeg venter lidt med at færdiggøre denne del. Ligger du et svar?

mvh Mads
Avatar billede moddi100 Seniormester
07. januar 2016 - 21:32 #5
Det burde ellers bare være at køre 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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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