[SQL]Probleem met group by en order

Pagina: 1
Acties:

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 21-05 00:00
Ik heb een tabel met (heel veel) rijen. Twee colommen hiervan zijn

- url
- icratio

Nou wil ik de rijen met het laagste icratio selecteren, maar ik wil geen dubbele urls.

Wat nou het probleem is:

ik heb bijvoorbeeld 2 dezelfde urls. De een heeft icratio 1000 de ander 5.
De query zou dus 1 rij moeten selecteren, en wel die met een icratio van 5. Wat group by dus doet is juist de rij met icratio 1000 houden en die met 5 weglaten.

Dit geeft dus niet het juiste effect.
Omdat er meerdere colommen zijn die verschillen kan ik geen disctinct gebruiken..tevens kan ik niet group by icratio doen want daarin mogen weer wel dubbele voorkomen.

Weet iemand hoe ik dit zou kunnen oplossen?

code:
1
SELECT `id` FROM `tabelnaam` GROUP BY `url`  ORDER BY `icratio`



Er zit dus nog wel meer bij de query, maar dat is niet relevant aan het probleem.

Leef lekker in het nu, er is niks anders


  • André
  • Registratie: Maart 2002
  • Laatst online: 18-05 16:30

André

Analytics dude

Niet GROUP BY gebruiken? Die dubbele urls kun je er later zelf wel uithalen.

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 21-05 00:00
Maar er zit ook een limit op,dan zou ik bij elke rij moeten kijken of ie al een keer voorgekomen is in php... het zou toch wel moeten kunnen?
Ik zit nu even naar max te kijken,misschien dat ik daar iets mee kan.
edit:
nee max is het ook niet

[ Voor 9% gewijzigd door FireFoz op 23-09-2004 11:28 ]

Leef lekker in het nu, er is niks anders


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Je hebt een subquery nodig, wat voor database gebruik je?

Who is John Galt?


  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 21-05 00:00
justmental schreef op 23 september 2004 @ 11:42:
Je hebt een subquery nodig, wat voor database gebruik je?
Mysql

Leef lekker in het nu, er is niks anders


  • J2pc
  • Registratie: Oktober 2002
  • Niet online

J2pc

UT Tux Edition

in de SELECT regel een min(icratio) gebruiken?

Deze functie pakt namelijk de laagste icratio uit je group

[ Voor 41% gewijzigd door J2pc op 23-09-2004 11:48 ]

"The computer is incredibly fast, accurate, and stupid. Man is unbelievably slow, inaccurate, and brilliant. The marriage of the two is a challenge and opportunity beyond imagination." © Stuart G. Walesh


  • drpeer_holland
  • Registratie: September 2001
  • Laatst online: 22-05 22:24
FireFoz schreef op 23 september 2004 @ 11:25:
Maar er zit ook een limit op,dan zou ik bij elke rij moeten kijken of ie al een keer voorgekomen is in php... het zou toch wel moeten kunnen?
Ik zit nu even naar max te kijken,misschien dat ik daar iets mee kan.
edit:
nee max is het ook niet
Volgens mij is het SELECT DISTINCT "id"

  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
ff uit de top van me koppie:

code:
1
2
3
4
5
6
7
8
SELECT 'id' FROM 'tabelnaam' T1
WHERE 'id' IN
  (
    SELECT 'id' from 'tabelnaam' T2 
    WHERE T1.'url' = T2.'url' AND
    T2.'icratio' = (SELECT MIN('icratio') FROM 'tabelnaam' WHERE 'url' = T2.'url)
  ) 
ORDER BY 'icratio'


De quotes moet je dan ff vervangen door de veldnamen.
Je kunt natuurlijk ook je 'url' en je 'icratio' erbij SELECTen

[ Voor 57% gewijzigd door Robbemans op 23-09-2004 11:58 ]


  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 21-05 00:00
drpeer_holland schreef op 23 september 2004 @ 11:48:
[...]


Volgens mij is het SELECT DISTINCT "id"
Zou het dan niet distinct op url zijn aangezien id altijd uniek is en url niet?

Leef lekker in het nu, er is niks anders


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
:?

Waarom niet gewoon:
code:
1
2
3
SELECT url, MIN(icratio) 
FROM Tabel
GROUP BY url

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
FireFoz schreef op 23 september 2004 @ 11:51:
[...]


Zou het dan niet distinct op url zijn aangezien id altijd uniek is en url niet?
Ja en nee. Op de manier die ik je net gaf geeft ie hem altijd maar 1 keer terug, omdat de minimale waarde maar 1 keer voorkomt.

  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
P_de_B schreef op 23 september 2004 @ 11:55:
:?

Waarom niet gewoon:
code:
1
2
3
SELECT url, MIN(icratio) 
FROM Tabel
GROUP BY url
En waar blijft je ID dan?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Robbemans schreef op 23 september 2004 @ 11:56:
[...]


En waar blijft je ID dan?
Hmmm, had niet begrepen dat 'ie die ook moet hebben. Zoiets dan?

code:
1
2
3
4
5
6
SELECT * 
FROM Tabel T1 
INNER JOIN (SELECT url, MIN(icratio) icratio
                   FROM Tabel
                   GROUP BY url)T2
ON T1.URL= T2.URL AND T1.icratio = T2.icratio

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
P_de_B schreef op 23 september 2004 @ 12:01:
[...]


Hmmm, had niet begrepen dat 'ie die ook moet hebben. Zoiets dan?

code:
1
2
3
4
5
6
SELECT * 
FROM Tabel T1 
INNER JOIN (SELECT url, MIN(icratio) icratio
                   FROM Tabel
                   GROUP BY url)T2
ON T1.URL= T2.URL AND T1.icratio = T2.icratio
Bijna... De ORDER BY mis ik nog :)

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 21-05 00:00
Ik ga even stoeien met de antwoorden, bedankt tot zo ver _/-\o_

Leef lekker in het nu, er is niks anders


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 13:17

Dido

heforshe

Robbemans schreef op 23 september 2004 @ 12:04:
Bijna... De ORDER BY mis ik nog :)
Die's ook niet meer nodig, dankzij de MIN ;)

Wat betekent mijn avatar?


  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 21-05 00:00
P_de_B schreef op 23 september 2004 @ 12:01:
[...]


Hmmm, had niet begrepen dat 'ie die ook moet hebben. Zoiets dan?

code:
1
2
3
4
5
6
SELECT * 
FROM Tabel T1 
INNER JOIN (SELECT url, MIN(icratio) icratio
                   FROM Tabel
                   GROUP BY url)T2
ON T1.URL= T2.URL AND T1.icratio = T2.icratio
moet dat niet iets zijn als

code:
1
2
3
4
5
6
SELECT * 
FROM Tabel T1 
INNER JOIN (SELECT url, MIN(icratio) AS icratio
                   FROM Tabel
                   GROUP BY url)T2
ON T1.URL= T2.URL AND T1.icratio = T2.icratio



(AS icratio)
Want zo werkt ie ook niet..heb al van alles veranderd maar krijg het niet werkend

Leef lekker in het nu, er is niks anders


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
FireFoz schreef op 23 september 2004 @ 12:41:
[...]

moet dat niet iets zijn als
[..]
(AS icratio)
Want zo werkt ie ook niet..heb al van alles veranderd maar krijg het niet werkend
In veel DMBS'sen is 'AS' optioneel. Ik weet trouwens niet of MySQL met derived tables overweg kan. Iemand die dat kan bevestigen?

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Ondersteunt je database subselects ?

Edit : MySQL heeft subselects vanaf 4.1

[ Voor 38% gewijzigd door Verwijderd op 23-09-2004 12:55 ]


  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 21-05 00:00
Verwijderd schreef op 23 september 2004 @ 12:52:
Ondersteunt je database subselects ?

Edit : MySQL heeft subselects vanaf 4.1
Hmm ik heb MySQL 4.0.18, nee dus :'(

Leef lekker in het nu, er is niks anders


  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 21-05 00:00
Weet iemand nog een andere manier?
Modbreak:Kicken is pas toegestaan na 24 uur :) Men ziet je topic wel vanzelf :)

[ Voor 59% gewijzigd door gorgi_19 op 23-09-2004 15:53 ]

Leef lekker in het nu, er is niks anders


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Speciaal voor jou heb ik de mysql site weer eens opgezocht. Ik weet niet of er een andere mogelijkheid is, maar je kunt altijd temptables gebruiken. Dit kun je doen met het CREATE TEMPORARY TABLE, kijk daarvoor op http://dev.mysql.com/doc/mysql/en/CREATE_TABLE.html .

Gebruik vervolgens SELECT INTO om de gegevens die je nodig hebt (in dit geval url en icratio) om te matchen en doe vervolgens een INNER JOIN tussen je originele tabel en de temptable (matchen op url en icratio).

Je kunt je temptable vervolgens specifiek droppen met DROP TABLE.

Wat meer info is hier te vinden:
http://dev.mysql.com/doc/mysql/en/Rewriting_subqueries.html
in de user comments

Ik heb dit overigens al eens eerder geformuleerd:
[rml][ MySQL] tussenresultaat query opslaan[/rml]

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 21-05 00:00
bigbeng schreef op 23 september 2004 @ 16:06:
Speciaal voor jou heb ik de mysql site weer eens opgezocht. Ik weet niet of er een andere mogelijkheid is, maar je kunt altijd temptables gebruiken. Dit kun je doen met het CREATE TEMPORARY TABLE, kijk daarvoor op http://dev.mysql.com/doc/mysql/en/CREATE_TABLE.html .

Gebruik vervolgens SELECT INTO om de gegevens die je nodig hebt (in dit geval url en icratio) om te matchen en doe vervolgens een INNER JOIN tussen je originele tabel en de temptable (matchen op url en icratio).

Je kunt je temptable vervolgens specifiek droppen met DROP TABLE.

Wat meer info is hier te vinden:
http://dev.mysql.com/doc/mysql/en/Rewriting_subqueries.html
in de user comments

Ik heb dit overigens al eens eerder geformuleerd:
[rml][ MySQL] tussenresultaat query opslaan[/rml]
:*)
Maar zou dat niet hetzelfde zijn als alles te selecten gesorteerd op icratio en vervolgens bij elke rij kijken of ie al een keer voorgekomen en zoja dan overslaan en naar de volgende rij gaan? Wat ik eigenlijk wil is gewoon puur selecten wat ik nodig heb, en niet meer :)

Leef lekker in het nu, er is niks anders


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
FireFoz schreef op 23 september 2004 @ 17:23:
[...]


:*)
Maar zou dat niet hetzelfde zijn als alles te selecten gesorteerd op icratio en vervolgens bij elke rij kijken of ie al een keer voorgekomen en zoja dan overslaan en naar de volgende rij gaan? Wat ik eigenlijk wil is gewoon puur selecten wat ik nodig heb, en niet meer :)
Zonder een subselect gaat dit je volgens mij niet lukken, of je moet ook aggregate functies (sum, min, max etc.) op alle andere kolommen die je terug wilt hebben toepassen.

Misschien wil je hoster wel upgraden naar een andere versie van MySQL?

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1