|
| 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/
| |
|
|