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

Søg
Reklame
Statistik
Spørgsmål : 177513
Tips : 31968
Nyheder : 719565
Indlæg : 6408605
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste