Avatar billede jakobdo Ekspert
09. december 2010 - 19:58 Der er 10 kommentarer og
1 løsning

Group By og så alligevel ikke

Hej,
jeg har en tabel, simplificeret:

ID, NAVN, TEKST

Og data kunne se sådan ud:

1, Jakob, Davs med dig
2, Jakob, Hvordan går det?
3, Olsen, Det går godt!
4, Olsen, Er du sikker?
5, Jakob, Ja da
6, Jakob, 100%

Hvis jeg laver:

SELECT COUNT(*) AS antal, Navn FROM tableName GROUP BY navn ORDER BY antal DESC

Så vil jeg få noget i stil med:

4, Jakob
2, Olsen

Kunne jeg få noget i stil med:

Jakob, Davs med dig
Jakob, Hvordan går det?
Jakob, Ja da
Jakob, 100%
Olsen, Det går godt!
Olsen, Er du sikker?

Hvor den giver mig alle rækker, men den viser Jakob først, da der netop er 4 af den samlet set.
Olsen som nummer "2", da der netop er 2 af Olsen osv...

Håber i forstår og hvis ikke, så spørg endeligt.
Avatar billede arne_v Ekspert
09. december 2010 - 20:17 #1
gaet:

SELECT DISTINCT t1.navn,t1.tekst
FROM tabel t1, tabel t2
WHERE t1.navn=t2.navn
ORDER BY COUNT(*) DESC,t1.id ASC
Avatar billede jakobdo Ekspert
10. december 2010 - 10:32 #2
Hej Arne,
undskyld jeg ikke har fået testet det lidt før, men det virker desværre ikke.
Det giver mig følgende resultat:

SELECT DISTINCT t1.navn, t1.tekst
FROM test2 t1, test2 t2
WHERE t1.navn = t2.navn
ORDER BY COUNT( * ) DESC , t1.id ASC

Jakob     Davs med dig
Avatar billede arne_v Ekspert
10. december 2010 - 23:55 #3
Efter lidt eksperimenteren:

SELECT name,txt
FROM aggr t1
ORDER BY (SELECT COUNT(*) FROM aggr t2 WHERE t1.name=t2.name) DESC,id ASC;
Avatar billede jakobdo Ekspert
12. december 2010 - 21:26 #4
Hej Arne,
det er ved at være tæt på.
Mit næste problem er selvfølgelig, at min sql ikke er så simpel.

På nuværende tidspunkt har jeg "løst" det med en sql og en sql pr resultat.

Det er som følger:

SELECT name, category
FROM nomination
WHERE id = $id
AND name != ''
GROUP BY category, name

og for hver resultat, hvor jeg selvfølgelig får den med flest hits som nummer 1 i en given kategori etc...

Så laver jeg følgende sql:

SELECT
  name,
FROM
  nomination
WHERE
  name = '".$r['name']."'
AND
  id = ".$r['id']."
ORDER BY
  name

kan det også løses i en sql ?
og er det nødvendigvis en fordel at lave det i en sql ?
Avatar billede arne_v Ekspert
12. december 2010 - 23:02 #5
Jeg kan ikke engang gennemskue hvad du laver der.
Avatar billede jakobdo Ekspert
13. december 2010 - 08:28 #6
Ok, det jeg gør er følgende:

Jeg laver først et udtræk, baseret på et ID.

Det udtræk gruppere jeg på en fremmednøgle (category) og på name og tæller ellers så bare op og sortere på antal faldende.

Herefter er det så jeg laver et nyt udtræk pr række.

Hvis f.eks. jeg fik:

antal=5, name=jakob, category=12

Så laver jeg nu et udtræk på:

select * from tabelname where name = jakob and category = 12

Og dette skulle så gerne give mig 5 udtræk, hvor jeg har alle de data jeg i sidste ende skal bruge.

Man kan muligvis godt bygge det ind i din sql, men det går umiddelbart over min forstand. :o)
Avatar billede arne_v Ekspert
28. december 2010 - 01:30 #7
Kan du vise nogle eksempel data og ønsket output?
Avatar billede jakobdo Ekspert
28. december 2010 - 09:18 #8
Hej Arne,
det har du i mit første indlæg.
Avatar billede arne_v Ekspert
28. december 2010 - 17:58 #9
Og det problem har jeg løst.

Desværre var det jo ikke helt den rigtige problem stilling.
Avatar billede jakobdo Ekspert
04. januar 2011 - 12:53 #10
Godt ord igen.
Problemet blev løst med et hovedudtræk, som så laver sub_queries baseret på første query.

Så smid svar og vi kan lukke.
Avatar billede arne_v Ekspert
06. januar 2011 - 02:21 #11
ok
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