/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Finde klubrekorder i database.
Fra : Robert Piil


Dato : 08-06-06 22:25

Jeg har lavet og vedligeholder en hjemmeside for en havfiskeklub, hvor
vi registrerer medlemmer og fangede fisk i hver sin tabel (kun med
relevante felter). Databasen er MySQL 4.0:

Medlemmer
=========
Medlemsnummer
....
....

Fisk:
=====
FiskID
Medlemsnummer
Art
Vaegt
Laengde

Klubens regler for rekorder er at den tungeste fisk selvfølgelig er
klubrekord, med den lille tilføjelse der det interessant i database
sammenhæng, at hvis der ikke er fanget nogle på et kilo eller derover,
så er den længste fisk (over mindstemålet) klubrekord. Se evt. nederst
på <http://maaleren.dk/rekord.php>

Jeg har for længe siden (dengang med en MySQL 3-database - tror jeg)
fået lavet nået der næsten virker - en uskøn sammenblanding af SQL,
PHP og temporære tabeller, men kønt er det ikke:
<http://maaleren.dk/rekord.phps>.

Det der ikke virker ordentligt nu, er at vi i nogle tilfælde både har
arter i databasen med vægt, og andre fisk af samme art angivet med
længde. Derfor kommer den art til at fremgå af klubrekordsiden to
gange, men selvfølgelig er kun den ene korrekt.

Jeg kunne selvfølgelig fortsætte med at slamkode, og lave endnu et
hack, men tænkte at ovenstående må kunne gøres korrekt med én
SQL-sætning. Er der nogen der har mod på at komme med et bud?

--
Robert Piil

Demo - http://piil.org/output/

 
 
Martin (09-06-2006)
Kommentar
Fra : Martin


Dato : 09-06-06 01:06

Robert Piil wrote:
> Jeg har lavet og vedligeholder en hjemmeside for en havfiskeklub, hvor
> vi registrerer medlemmer og fangede fisk i hver sin tabel (kun med
> relevante felter). Databasen er MySQL 4.0:
>
> Medlemmer
> =========
> Medlemsnummer
> ...
> ...
>
> Fisk:
> =====
> FiskID
> Medlemsnummer
> Art
> Vaegt
> Laengde
>

Jeg ville nok have en tabel med fiskens navn/art/osv og en til fangede fisk

Fx.

Fisk:
=====
FiskID
Fisk_Navn
Fisk_Beskrivelse

FangedeFisk
====
FangID
fisk_id
Medlemsnummer
Vaegt
Laengde


SELECT
FangID, Medlemsnummer FROM FangedeFisk
WHERE
fisk_id = '$valgte_fisk'
ORDER BY
Vaegt, Laengde

også lidt i PHP

> Klubens regler for rekorder er at den tungeste fisk selvfølgelig er
> klubrekord, med den lille tilføjelse der det interessant i database
> sammenhæng, at hvis der ikke er fanget nogle på et kilo eller derover,
> så er den længste fisk (over mindstemålet) klubrekord. Se evt. nederst
> på <http://maaleren.dk/rekord.php>

if($vaegt > $min_vaegt) echo $laengde;
else echo $vaegt

> Det der ikke virker ordentligt nu, er at vi i nogle tilfælde både har
> arter i databasen med vægt, og andre fisk af samme art angivet med
> længde. Derfor kommer den art til at fremgå af klubrekordsiden to
> gange, men selvfølgelig er kun den ene korrekt.

Dette ville du undgå meget nemmere med mine tabeller.

> Jeg kunne selvfølgelig fortsætte med at slamkode, og lave endnu et
> hack, men tænkte at ovenstående må kunne gøres korrekt med én
> SQL-sætning. Er der nogen der har mod på at komme med et bud?

Nu er jeg ikke den bedste til SQL, men er rimelig til databaseopbygningen :)

Robert Piil (09-06-2006)
Kommentar
Fra : Robert Piil


Dato : 09-06-06 07:00

On Fri, 09 Jun 2006 02:05:47 +0200, Martin <news@natten-i.dk> wrote:

>Jeg ville nok have en tabel med fiskens navn/art/osv og en til fangede fisk

Det skal man selvfølgelig, hvis der skal normaliseres i bund.


>SELECT
> FangID, Medlemsnummer FROM FangedeFisk
>WHERE
> fisk_id = '$valgte_fisk'
>ORDER BY
> Vaegt, Laengde
>
>også lidt i PHP

Det bliver selvfølgelig lidt kønnere end det jeg har lavet, men skal
det være smukt, skal det helst være ren sql - det må kunne lade sig
gøre.

--
Robert Piil

Demo - http://piil.org/output/

Michael Zedeler (09-06-2006)
Kommentar
Fra : Michael Zedeler


Dato : 09-06-06 11:36

Robert Piil wrote:
> [...]Jeg kunne selvfølgelig fortsætte med at slamkode, og lave endnu et
> hack, men tænkte at ovenstående må kunne gøres korrekt med én
> SQL-sætning. Er der nogen der har mod på at komme med et bud?

Kan du ikke skrive mere konkret hvad for forespørgsler, du har brug for?
Du kan nøjes med at vise nogle eksempler på tabelindhold og tilhørende
resultater.

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Robert Piil (09-06-2006)
Kommentar
Fra : Robert Piil


Dato : 09-06-06 11:59

On Fri, 09 Jun 2006 12:36:03 +0200, Michael Zedeler
<michael@zedeler.dk> wrote:

>Robert Piil wrote:
>> [...]Jeg kunne selvfølgelig fortsætte med at slamkode, og lave endnu et
>> hack, men tænkte at ovenstående må kunne gøres korrekt med én
>> SQL-sætning. Er der nogen der har mod på at komme med et bud?
>
>Kan du ikke skrive mere konkret hvad for forespørgsler, du har brug for?
>Du kan nøjes med at vise nogle eksempler på tabelindhold og tilhørende
>resultater.

Jo:

Tabellen Fisk:
==============
FiskID Art       Vægt   Længde   Medlemsnummer
=====================================================
19    Lange       8.00    0.0    3
20    Lange       10.00    0.0    3
21    Sej       10.50    0.0    45
23    Lubbe       5.50    0.0    44
24    Makrel       0.00    40.0    2
25    Hornfisk    0.00    75.0    32
26    Skrubbe    0.00    33.0    25
27    Rødspætte    0.00    39.0    3
28    Ising       0.00    34.0    22
29   Skrubbe      1.50   0.0   3
30   Rødspætte   1.36   0.0   6

Resultat:
FiskID Art       Vægt   Længde   Medlemsnummer
=====================================================
20    Lange       10.00    0.0    3
21    Sej       10.50    0.0    45
23    Lubbe       5.50    0.0    44
24    Makrel       0.00    40.0    2
25    Hornfisk    0.00    75.0    32
28    Ising       0.00    34.0    22
29   Skrubbe      1.50   0.0   3
30   Rødspætte   1.36   0.0   6
--
Robert Piil

"Diskutér aldrig med en tåbe. Han trækker dig ned på sit eget niveau og slår dig på rutinen"
Ukendt (via Worminator)

Robert Piil (09-06-2006)
Kommentar
Fra : Robert Piil


Dato : 09-06-06 12:16

On Fri, 09 Jun 2006 12:59:09 +0200, Robert Piil <piil@nospam.dk>
wrote:

>FiskID Art       Vægt   Længde   Medlemsnummer
>=====================================================
>19    Lange       8.00    0.0    3
>20    Lange       10.00    0.0    3
>21    Sej       10.50    0.0    45
>23    Lubbe       5.50    0.0    44
>24    Makrel       0.00    40.0    2
>25    Hornfisk    0.00    75.0    32
>26    Skrubbe    0.00    33.0    25
>27    Rødspætte    0.00    39.0    3
>28    Ising       0.00    34.0    22
>29   Skrubbe      1.50   0.0   3
>30   Rødspætte   1.36   0.0   6
>
>Resultat:
>FiskID Art       Vægt   Længde   Medlemsnummer
>=====================================================
>20    Lange       10.00    0.0    3
>21    Sej       10.50    0.0    45
>23    Lubbe       5.50    0.0    44
>24    Makrel       0.00    40.0    2
>25    Hornfisk    0.00    75.0    32
>28    Ising       0.00    34.0    22
>29   Skrubbe      1.50   0.0   3
>30   Rødspætte   1.36   0.0   6

....og forklaringen:

- Række 19 er ikke med, da række 20 har en højere vægt.
- Række 26 er ikke med, da den kun har en længde, mens række 29 har en
vægt
- Række 27 er ikke med, da den kun har en længde, mens række 30 har en
vægt

Der kan ikke være to rækker (klubrekorder) med identisk art (hvis to
rækker har samme vægt, skal man faktisk have fat i datoen for at
afgøre hvilken af dem, der skal med - det finder jeg selv ud af, der
er en tredje tabel med indeover med hvilken tur (og dermed fangstdato)
der er relevant.
--
Robert Piil

"Diskutér aldrig med en tåbe. Han trækker dig ned på sit eget niveau og slår dig på rutinen"
Ukendt (via Worminator)

Michael Zedeler (09-06-2006)
Kommentar
Fra : Michael Zedeler


Dato : 09-06-06 12:19

Robert Piil wrote:
> On Fri, 09 Jun 2006 12:36:03 +0200, Michael Zedeler
> <michael@zedeler.dk> wrote:
>
>
>>Robert Piil wrote:
>>
>>>[...]Jeg kunne selvfølgelig fortsætte med at slamkode, og lave endnu et
>>>hack, men tænkte at ovenstående må kunne gøres korrekt med én
>>>SQL-sætning. Er der nogen der har mod på at komme med et bud?
>>
>>Kan du ikke skrive mere konkret hvad for forespørgsler, du har brug for?
>>Du kan nøjes med at vise nogle eksempler på tabelindhold og tilhørende
>>resultater.
>
> Tabellen Fisk:
> ==============
> FiskID Art       Vægt   Længde   Medlemsnummer
> =====================================================
> 19    Lange       8.00    0.0    3
> 20    Lange       10.00    0.0    3
> 21    Sej       10.50    0.0    45
> 23    Lubbe       5.50    0.0    44
> 24    Makrel       0.00    40.0    2
> 25    Hornfisk    0.00    75.0    32
> 26    Skrubbe    0.00    33.0    25
> 27    Rødspætte    0.00    39.0    3
> 28    Ising       0.00    34.0    22
> 29   Skrubbe      1.50   0.0   3
> 30   Rødspætte   1.36   0.0   6
>
> Resultat:
> FiskID Art       Vægt   Længde   Medlemsnummer
> =====================================================
> 20    Lange       10.00    0.0    3
> 21    Sej       10.50    0.0    45
> 23    Lubbe       5.50    0.0    44
> 24    Makrel       0.00    40.0    2
> 25    Hornfisk    0.00    75.0    32
> 28    Ising       0.00    34.0    22
> 29   Skrubbe      1.50   0.0   3
> 30   Rødspætte   1.36   0.0   6

Der er flere ting som skal ordnes. Først og fremmest skal man have
stoppet id'er på de fisk, der har slået en rekord. Hvis to fisk deler
rekorden, går jeg ud fra at de begge skal listes op.

SELECT MAX(a.Vægt) maxvægt,
   MAX(a.Længde) AS maxlængde,
   a.Art,
   b.FiskID,
   b.Vægt,
   b.Længde
FROM fisk AS a, fisk AS b
WHERE a.art = b.art
GROUP BY a.Art, b.FiskID, b.Vægt, b.Længde
HAVING maxvægt = b.Vægt AND maxlængde = b.Længde

Jeg tror den gør det nogenlunde. Dog med forbehold for fejl.
Bemærk at den ikke tager højde for at vægten skal sorteres først. Det
betyder at hvis du registrerer en fisk med både vægt og længde, kan du
få forkerte resultater. Dette problem kan også afhjælpes.

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Michael Zedeler (09-06-2006)
Kommentar
Fra : Michael Zedeler


Dato : 09-06-06 12:21

Michael Zedeler wrote:
> Robert Piil wrote:
>
>> On Fri, 09 Jun 2006 12:36:03 +0200, Michael Zedeler
>> <michael@zedeler.dk> wrote:
>>
>>
>>> Robert Piil wrote:
>>>
>>>> [...]Jeg kunne selvfølgelig fortsætte med at slamkode, og lave endnu et
>>>> hack, men tænkte at ovenstående må kunne gøres korrekt med én
>>>> SQL-sætning. Er der nogen der har mod på at komme med et bud?
>>>
>>>
>>> Kan du ikke skrive mere konkret hvad for forespørgsler, du har brug
>>> for? Du kan nøjes med at vise nogle eksempler på tabelindhold og
>>> tilhørende resultater.
>>
>>
>> Tabellen Fisk:
>> ==============
>> FiskID Art Vægt Længde Medlemsnummer
>> =====================================================
>> 19 Lange 8.00 0.0 3
>> 20 Lange 10.00 0.0 3
>> 21 Sej 10.50 0.0 45
>> 23 Lubbe 5.50 0.0 44
>> 24 Makrel 0.00 40.0 2
>> 25 Hornfisk 0.00 75.0 32
>> 26 Skrubbe 0.00 33.0 25
>> 27 Rødspætte 0.00 39.0 3
>> 28 Ising 0.00 34.0 22
>> 29 Skrubbe 1.50 0.0 3
>> 30 Rødspætte 1.36 0.0 6
>>
>> Resultat:
>> FiskID Art Vægt Længde Medlemsnummer
>> =====================================================
>> 20 Lange 10.00 0.0 3
>> 21 Sej 10.50 0.0 45
>> 23 Lubbe 5.50 0.0 44
>> 24 Makrel 0.00 40.0 2
>> 25 Hornfisk 0.00 75.0 32
>> 28 Ising 0.00 34.0 22
>> 29 Skrubbe 1.50 0.0 3
>> 30 Rødspætte 1.36 0.0 6
>
>
> Der er flere ting som skal ordnes. Først og fremmest skal man have
> stoppet id'er på de fisk, der har slået en rekord. Hvis to fisk deler
> rekorden, går jeg ud fra at de begge skal listes op.
>
> SELECT MAX(a.Vægt) maxvægt,
> MAX(a.Længde) AS maxlængde,
> a.Art,
> b.FiskID,
> b.Vægt,
> b.Længde
> FROM fisk AS a, fisk AS b
> WHERE a.art = b.art
> GROUP BY a.Art, b.FiskID, b.Vægt, b.Længde
> HAVING maxvægt = b.Vægt AND maxlængde = b.Længde
>
> Jeg tror den gør det nogenlunde. Dog med forbehold for fejl.
> Bemærk at den ikke tager højde for at vægten skal sorteres først. Det
> betyder at hvis du registrerer en fisk med både vægt og længde, kan du
> få forkerte resultater. Dette problem kan også afhjælpes.

Jeg har lige checket tabellen igen og der vil opstå nogle problemer med
arter som optræder både med længde- og vægtrekord, men prøv at se
hvordan det ARTer sig

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Robert Piil (09-06-2006)
Kommentar
Fra : Robert Piil


Dato : 09-06-06 12:29

On Fri, 09 Jun 2006 13:20:32 +0200, Michael Zedeler
<michael@zedeler.dk> wrote:

>Jeg har lige checket tabellen igen og der vil opstå nogle problemer med
>arter som optræder både med længde- og vægtrekord, men prøv at se
>hvordan det ARTer sig

Jep.

Optræder en art i en række med vægt og i en anden med længde, kommer
ingen af dem vist med.
--
Robert Piil

"Diskutér aldrig med en tåbe. Han trækker dig ned på sit eget niveau og slår dig på rutinen"
Ukendt (via Worminator)

Robert Piil (09-06-2006)
Kommentar
Fra : Robert Piil


Dato : 09-06-06 13:50

On Fri, 09 Jun 2006 13:28:34 +0200, Robert Piil <piil@nospam.dk>
wrote:

>Jep.
>
>Optræder en art i en række med vægt og i en anden med længde, kommer
>ingen af dem vist med.

Optræder der kun én række af en art i databasen, kommer den heller
ikke med.
--
Robert Piil

"Diskutér aldrig med en tåbe. Han trækker dig ned på sit eget niveau og slår dig på rutinen"
Ukendt (via Worminator)

Robert Piil (09-06-2006)
Kommentar
Fra : Robert Piil


Dato : 09-06-06 12:26

On Fri, 09 Jun 2006 13:18:50 +0200, Michael Zedeler
<michael@zedeler.dk> wrote:

>Der er flere ting som skal ordnes. Først og fremmest skal man have
>stoppet id'er på de fisk, der har slået en rekord. Hvis to fisk deler
>rekorden, går jeg ud fra at de begge skal listes op.
>
>SELECT MAX(a.Vægt) maxvægt,
>   MAX(a.Længde) AS maxlængde,
>   a.Art,
>   b.FiskID,
>   b.Vægt,
>   b.Længde
>FROM fisk AS a, fisk AS b
>WHERE a.art = b.art
>GROUP BY a.Art, b.FiskID, b.Vægt, b.Længde
>HAVING maxvægt = b.Vægt AND maxlængde = b.Længde

Tak for den. Den er meget smukkere end det jeg har lavet...

>Jeg tror den gør det nogenlunde. Dog med forbehold for fejl.
>Bemærk at den ikke tager højde for at vægten skal sorteres først. Det
>betyder at hvis du registrerer en fisk med både vægt og længde, kan du
>få forkerte resultater. Dette problem kan også afhjælpes.

.... men den gør nøjagtig det samme (se
<http://maaleren.dk/rekord.php>) nemlig viser to klubrekorder for fx.
skrubber, hvis der er både er en række med længde og en med vægt i
databasen. Det er lige nøgjagtig afhjælpning på det problem, som var
min egentlige årsag til at begynde at rode med skidtet igen.
--
Robert Piil

"Diskutér aldrig med en tåbe. Han trækker dig ned på sit eget niveau og slår dig på rutinen"
Ukendt (via Worminator)

Michael Zedeler (09-06-2006)
Kommentar
Fra : Michael Zedeler


Dato : 09-06-06 14:30

Robert Piil wrote:
> On Fri, 09 Jun 2006 13:18:50 +0200, Michael Zedeler
> <michael@zedeler.dk> wrote:
>
>
>>Der er flere ting som skal ordnes. Først og fremmest skal man have
>>stoppet id'er på de fisk, der har slået en rekord. Hvis to fisk deler
>>rekorden, går jeg ud fra at de begge skal listes op.
>>
>>SELECT MAX(a.Vægt) maxvægt,
>>   MAX(a.Længde) AS maxlængde,
>>   a.Art,
>>   b.FiskID,
>>   b.Vægt,
>>   b.Længde
>
>>FROM fisk AS a, fisk AS b
>
>>WHERE a.art = b.art
>>GROUP BY a.Art, b.FiskID, b.Vægt, b.Længde
>>HAVING maxvægt = b.Vægt AND maxlængde = b.Længde
>
>
> Tak for den. Den er meget smukkere end det jeg har lavet...
>
>>Jeg tror den gør det nogenlunde. Dog med forbehold for fejl.
>>Bemærk at den ikke tager højde for at vægten skal sorteres først. Det
>>betyder at hvis du registrerer en fisk med både vægt og længde, kan du
>>få forkerte resultater. Dette problem kan også afhjælpes.
>
> ... men den gør nøjagtig det samme (se
> <http://maaleren.dk/rekord.php>) nemlig viser to klubrekorder for fx.
> skrubber, hvis der er både er en række med længde og en med vægt i
> databasen. Det er lige nøgjagtig afhjælpning på det problem, som var
> min egentlige årsag til at begynde at rode med skidtet igen.

Til gengæld kan du afhjælpe problemet i SQL hvis du har adgang til
subselects. Jeg kan ikke huske hvilken version af mysql, der har det,
men hvis du kan opgradere, er det altså gjort med en select udenpå det
ovenstående. Så er det hele løst i SQL.

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Michael Zedeler (09-06-2006)
Kommentar
Fra : Michael Zedeler


Dato : 09-06-06 14:41

Michael Zedeler wrote:
> Til gengæld kan du afhjælpe problemet i SQL hvis du har adgang til
> subselects. Jeg kan ikke huske hvilken version af mysql, der har det,
> men hvis du kan opgradere, er det altså gjort med en select udenpå det
> ovenstående. Så er det hele løst i SQL.

Jeg har lige checket. Det er mysql 4.1, der har subqueries (hvor
problemet er nemmest at løse).

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

greewskytte@gmail.co~ (14-06-2006)
Kommentar
Fra : greewskytte@gmail.co~


Dato : 14-06-06 06:42

Hejsa,

Har vi stadig et uløst problem her, eller?

Mvh.
Jesper


Robert Piil (14-06-2006)
Kommentar
Fra : Robert Piil


Dato : 14-06-06 07:09

On 13 Jun 2006 22:41:32 -0700, greewskytte@gmail.com wrote:

>Har vi stadig et uløst problem her, eller?

Ja, men jeg har ikke haft tid til at prøve ret meget selv, så jeg har
ikke spurgt videre ind til det.

Den oprindelige SQL-query Michael foreslog giver mig stadig to
problemer:

- Optræder en art i en række med vægt og i en anden med længde,
kommer ingen af dem vist med.

- Optræder der kun én række af en art i databasen, kommer den heller
ikke med.


--
Robert Piil

Demo - http://piil.org/output/

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409077
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste