|
| query med max() Fra : Lars L. Christensen |
Dato : 10-02-05 15:37 |
|
Hejsa gruppe
Jeg har et problem med en query, der ikke helt vil om jeg vil.
Min tabel:
id kob navn adresse postnr by power
I tabellen kan der være flere poster, der har samme værdi i "adresse"-
feltet. Der må dog kun returneres én post pr "sæt ens adresser", nemlig den
der har den højeste talværdi i feltet power.
Min Query er idag:
SELECT tabel1.*, postnumre.by FROM tabel1 INNER JOIN postnumre ON
tabel1.postnr = postnumre.postnr WHERE tabel1.adresse like
'enellerandenadresse' AND tabel1.postnr = '1553' group by kob order by rand
() limit 5;
Som det ses, så skal queryen kun returnere 5 svar ialt, der er randomized
imellem de enkelte hits.
Hvad er det lige jeg mangler for at få taget den post, som har den højeste
score, hvor der er flere ens adresser/postnummer (begge felter skal være
ens for at opfylde kriteriet).
mvh
Lars Christensen
| |
Kaj Julius (20-02-2005)
| Kommentar Fra : Kaj Julius |
Dato : 20-02-05 03:53 |
|
Så snart du bruger en funktion som MAX(etellerandetfelt), så skal du bruge
en GROUP BY instruktion, hvor du specificerer alle de andre felter, som
returneres. I dit eksempel angiver du ikke specifikt hvilke felter der er
tale om, idet du angiver * (alle tabellens felter).
Det kan du desværre ikke bruge i GROUP BY, så hvis du har mange felter du
returnerer, så er det bare uheldigt, du er nødt til at angive dem alle -
undtagen de felter felter du bruger i aggregate functions (MAX, MIN, AVG
osv.).
Eksempel:
SELECT navn, gadenavn, husnr, postnr, by, MAX(telefonnr) as primærtelefon,
COUNT(*) as telefoner
FROM adresser
WHERE postnr=5000
GROUP BY navn, gadenavn, husnr, postnr
HAVING COUNT(*) > 1
Den vil give alle adresser i Odense (postnr 5000), som har flere end et
telefonnr, men samtidig kun returnere det højeste telefonnr.
Håber det er forståeligt...
| |
Kristian Damm Jensen (20-02-2005)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 20-02-05 21:50 |
|
Lars L. Christensen wrote:
> Hejsa gruppe
>
> Jeg har et problem med en query, der ikke helt vil om jeg vil.
>
> Min tabel:
>
> id kob navn adresse postnr by power
>
> I tabellen kan der være flere poster, der har samme værdi i
"adresse"-
> feltet. Der må dog kun returneres én post pr "sæt ens adresser",
nemlig den
> der har den højeste talværdi i feltet power.
>
> Min Query er idag:
>
> SELECT tabel1.*, postnumre.by FROM tabel1 INNER JOIN postnumre ON
> tabel1.postnr = postnumre.postnr WHERE tabel1.adresse like
> 'enellerandenadresse' AND tabel1.postnr = '1553' group by kob order
by rand
> () limit 5;
>
> Som det ses, så skal queryen kun returnere 5 svar ialt, der er
randomized
> imellem de enkelte hits.
>
> Hvad er det lige jeg mangler for at få taget den post, som har den
højeste
> score, hvor der er flere ens adresser/postnummer (begge felter skal
være
> ens for at opfylde kriteriet).
>
1) "Group by" benyttes til aggregreringsfunktioner, som Kaj skriver.
Det er meningsforstyrende at benytte den til at fjerne dubletter.
Dertil har man distinct.
2) Når du skal finde den post af en serie, der har den højeste værdi
i eller anden række, er du nødt til at finde denne højeste værdi
igennen en subselect.
Dermed får du noget i denne retning
SELECT distinct t1.*, postnumre.by
FROM tabel1 t
INNER JOIN postnumre
ON t.postnr = postnumre.postnr
WHERE t.adresse like 'enellerandenadresse'
AND t.postnr = '1553'
AND power = (select max(power) from tabel1 t1 where t.id = t1.id)
order by rand() limit 5;
VH
Kristian
| |
Lars L. Christensen (22-02-2005)
| Kommentar Fra : Lars L. Christensen |
Dato : 22-02-05 11:06 |
|
"Kristian Damm Jensen" <kristiandamm@yahoo.dk> wrote in
news:1108932616.171551.244070@l41g2000cwc.googlegroups.com:
>
> Lars L. Christensen wrote:
>> Hejsa gruppe
>>
>> Jeg har et problem med en query, der ikke helt vil om jeg vil.
>>
>> Min tabel:
>>
>> id kob navn adresse postnr by power
>>
>> I tabellen kan der være flere poster, der har samme værdi i
> "adresse"-
>> feltet. Der må dog kun returneres én post pr "sæt ens adresser",
> nemlig den
>> der har den højeste talværdi i feltet power.
>>
>> Min Query er idag:
>>
>> SELECT tabel1.*, postnumre.by FROM tabel1 INNER JOIN postnumre ON
>> tabel1.postnr = postnumre.postnr WHERE tabel1.adresse like
>> 'enellerandenadresse' AND tabel1.postnr = '1553' group by kob order
> by rand
>> () limit 5;
>>
>> Som det ses, så skal queryen kun returnere 5 svar ialt, der er
> randomized
>> imellem de enkelte hits.
>>
>> Hvad er det lige jeg mangler for at få taget den post, som har den
> højeste
>> score, hvor der er flere ens adresser/postnummer (begge felter skal
> være
>> ens for at opfylde kriteriet).
>>
>
> 1) "Group by" benyttes til aggregreringsfunktioner, som Kaj skriver.
> Det er meningsforstyrende at benytte den til at fjerne dubletter.
> Dertil har man distinct.
>
> 2) Når du skal finde den post af en serie, der har den højeste værdi
> i eller anden række, er du nødt til at finde denne højeste værdi
> igennen en subselect.
>
> Dermed får du noget i denne retning
>
> SELECT distinct t1.*, postnumre.by
> FROM tabel1 t
> INNER JOIN postnumre
> ON t.postnr = postnumre.postnr
> WHERE t.adresse like 'enellerandenadresse'
> AND t.postnr = '1553'
> AND power = (select max(power) from tabel1 t1 where t.id = t1.id)
> order by rand() limit 5;
>
> VH
> Kristian
>
Hmmm... select inde i en anden select, det er vel ikke understøttet i en
mysql 3.23.x...
Får nemlig en fejl når jeg forsøger selecten inden i en select...
mvh
Lars
| |
Kristian Damm Jensen (23-02-2005)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 23-02-05 11:04 |
|
Lars L. Christensen wrote:
> Hmmm... select inde i en anden select, det er vel ikke understøttet
i en
> mysql 3.23.x...
Nej, der skal du op på version 4.
> Får nemlig en fejl når jeg forsøger selecten inden i en select...
Du har lige lært, hvorfor det er en god idé at fortælle, hvilket
DBMS man bruger. Specielt hvis det er et, der ikke understøtter
standard-SQL.
Jeg kan desværre ikke hjælpe dig med en løsning, der ikke kræver
subselects.
Du kan naturligvis dele selecten op i to, og gemme resultatet af den
første i en temporær tabel eller lignende.
VH
Kristian
| |
Peter Brodersen (23-02-2005)
| Kommentar Fra : Peter Brodersen |
Dato : 23-02-05 12:14 |
|
On 23 Feb 2005 02:04:17 -0800, "Kristian Damm Jensen"
<kristiandamm@gmail.com> wrote:
>> Hmmm... select inde i en anden select, det er vel ikke understøttet
>i en
>> mysql 3.23.x...
>Nej, der skal du op på version 4.
4.1, endda.
--
- Peter Brodersen
| |
Lars L. Christensen (23-02-2005)
| Kommentar Fra : Lars L. Christensen |
Dato : 23-02-05 17:34 |
|
Peter Brodersen <usenet2005@ter.dk> wrote in news:cvhohg$74p$1
@news.klen.dk:
> On 23 Feb 2005 02:04:17 -0800, "Kristian Damm Jensen"
> <kristiandamm@gmail.com> wrote:
>
>>> Hmmm... select inde i en anden select, det er vel ikke understøttet
>>i en
>>> mysql 3.23.x...
>>Nej, der skal du op på version 4.
>
> 4.1, endda.
>
hehe... bare en kanongod grund til at få opgraderet den gamle spand :)
mange tak til alle...
mvh
Lars
| |
|
|