[MySQL] Subquery in SELECT clause*

Pagina: 1
Acties:
  • 2.595 views sinds 30-01-2008
  • Reageer

  • RTBravo
  • Registratie: April 2000
  • Laatst online: 18-03 10:09

RTBravo

Verkopen jullie ook jojn?

Topicstarter
Hee mensen,

Ik heb hier een irritante query waar ik maar niet uitkom. Ik wil een result hebben waarin alle top 10's van een aantal mensen in staan. Tabel opbouw is als volgt:

Tabel "users"
-----------------------
userid


Tabel "scores"
----------------------
userid
omschrijving
score

Iedereen heeft meerdere scores bij verschillende omschrijvingen. Dit kunnen er >10 zijn, maar ik wil per persoon alleen de hoogste 10 hebben. Mijn MySQL versie kan subqueries aan, maar ik heb geen flauw id waar ik moet beginnen. Ik kan wel van 1 persoon zijn top 10 ophalen door gewoon te sorteren naar beneden op zijn score en dit te limiten naar 10. Maar hoe kan ik in een soort lus, per persoon zijn/haar top 10 bepalen en in 1 result onder elkaar weergeven met userid, omschrijving en score (elke persoon staat er dus 10x in).

Hoop dat jullie me hiermee kunnen helpen!

Alvast bedankt!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

top heet bij mysql limit.

Who is John Galt?


  • RTBravo
  • Registratie: April 2000
  • Laatst online: 18-03 10:09

RTBravo

Verkopen jullie ook jojn?

Topicstarter
dat schreef ik al in mn post, maar ik kom er niet uit hoe ik van al die mensen de limit van 10 onder elkaar zet :(

  • momania
  • Registratie: Mei 2000
  • Laatst online: 19:41

momania

iPhone 30! Bam!

Geef dan op z'n minst even relevante informatie, dus de query zoals je hem nu hebt ;)

[ Voor 19% gewijzigd door momania op 03-08-2005 15:28 ]

Neem je whisky mee, is het te weinig... *zucht*


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:44
Haal met MySQL alle gegevens op (en ja, dan zal je een aantal keer de naam enzo hebben), en dan zal je in jouw applicatie die gegevens moeten weergeven. Daar -in de app dus- kan je de opmaak verzorgen, bv, de naam slechts 1x laten zien, etc...
Je moet dit niet met sql proberen op te lossen

https://fgheysels.github.io/


Verwijderd

SQL:
1
 SELECT * FROM scores WHERE userid = '$userid' ORDER BY score DESC LIMIT 10  


??(weet niet of dit helemaal klopt, tijd geen sql meer gedaan ^^;;;

  • RTBravo
  • Registratie: April 2000
  • Laatst online: 18-03 10:09

RTBravo

Verkopen jullie ook jojn?

Topicstarter
De query die ik nu heb kan alleen voor 1 persoon zijn/haar top 10 bepalen :

SELECT u.userid,s.omschrijving,s.score
FROM users u,scores s
WHERE s.userid=u.userid
AND u.userid=1 (dit is dus van 1 persoon)
ORDER BY s.score DESC
LIMIT 0,10

Nu zou ik dit willen loopen per persoon en dus niet alleen voor persoon met id 1. En de results in 1 resultset onder elkaar. Snappie t nog? :)

Aanvulling : Ik MOET dit wel doen met SQL aangezien het in een statistiek overzicht moet welke alleen queries als input wil :(

[ Voor 15% gewijzigd door RTBravo op 03-08-2005 15:35 ]


  • momania
  • Registratie: Mei 2000
  • Laatst online: 19:41

momania

iPhone 30! Bam!

Moet het aantal personen waarvan je een top 10 wilt ook nog gelimiteerd zijn, of mogen dat alle personen zijn?

Neem je whisky mee, is het te weinig... *zucht*


  • RTBravo
  • Registratie: April 2000
  • Laatst online: 18-03 10:09

RTBravo

Verkopen jullie ook jojn?

Topicstarter
Het moeten alle personen zijn die in de users tabel voorkomen, dus iedereen. En dan per persoon 10 rijen met hun hoogste scores.

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:44
Zoiets
code:
1
2
3
4
5
6
select p.person_id, p.name, (select s.score
                              from score s
                              where s.person_id = p.person_id
                              order by s.score desc
                              limit 0, 10) as score
from person p

[ Voor 9% gewijzigd door whoami op 03-08-2005 15:36 ]

https://fgheysels.github.io/


  • RTBravo
  • Registratie: April 2000
  • Laatst online: 18-03 10:09

RTBravo

Verkopen jullie ook jojn?

Topicstarter
Dan zegt ie : Subquery returns more than 1 row :(

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:44
Meen je dat ?
Dat zou normaal gezien geen probleem mogen zijn.

Enkel als je een subquery in een where clause gebruikt die er als volgt uit ziet:
code:
1
2
...
where id = ( select id from tabel )

zou je zo'n fout mogen krijgen. Maarja, 't is weer mysql.

https://fgheysels.github.io/


Verwijderd

Ik zou geneigd zijn alle scores van alle personen te pakken en het sorteren en limiteren in php doen. Je moet toch al voor elk persoon een bulk informatie uitlezen, die paar rows die je dan extra uitleest maken dan ook niet zoveel meer uit.

  • RTBravo
  • Registratie: April 2000
  • Laatst online: 18-03 10:09

RTBravo

Verkopen jullie ook jojn?

Topicstarter
Ik wou dat ik er een grap over maakte :D maar hij zegt toch echt dit. Na wat rondzoeken zie ik ook overal alleen maar staan wat jij zei, dat het in de select geen moer moet uitmaken. Snap er ook geen bout van. Is het wel mogelijk wat ik wil?

en als reactie op bovenstaand : ik zou het graag zo doen, was ik allang klaar, maar ik heb alleen een invoerscherm waar ik een query in kan kloppen ter beschikking :(

[ Voor 27% gewijzigd door RTBravo op 03-08-2005 15:49 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:44
In ieder goed DBMS zou dat mogelijk moeten zijn met de query die ik jou gegeven heb...

https://fgheysels.github.io/


  • RTBravo
  • Registratie: April 2000
  • Laatst online: 18-03 10:09

RTBravo

Verkopen jullie ook jojn?

Topicstarter
Maar niet in mijn MySQL versie (4) blijkbaar :(

  • momania
  • Registratie: Mei 2000
  • Laatst online: 19:41

momania

iPhone 30! Bam!

Je zou het misschien nog 'smerig' kunnen oplossen met een WHERE x IN clause:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
select 
   p.person_id, 
   p.name, 
   s.score
from 
   person p,
   score s
where
   s.score_id IN (
      select s2.score_id
      from score s2
      where s2.person_id = p.person_id
      order by s2.score desc
      limit 0, 10)
order by
   p.person_id

Geen idee of dit zo direct werk, maar als een directe subquery zoals whoami gaf niet werkt zou dit misschien nog wel kunnen.

Neem je whisky mee, is het te weinig... *zucht*


  • RTBravo
  • Registratie: April 2000
  • Laatst online: 18-03 10:09

RTBravo

Verkopen jullie ook jojn?

Topicstarter
Thanx voor de reactie maar ik denk dat ik die bak t raam uit ga gooien. Nu zegt ie namelijk dit:

This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

WTF :(

  • cannibal
  • Registratie: Maart 2001
  • Laatst online: 04-05 11:24
Maar een select van meerdere rijen in de "select-clause" werkt volgens mij nergens hoor,
dit is dan toch echt een "bron" welke je gewoon bij de from-clause zult moeten plaatsen en daarna verwerken via de where-clause of met een join koppelen aan de andere gegevens.

mysql gebruikt pas subqueries en zo vanaf versie 4(.1?)

  • r0b
  • Registratie: December 2002
  • Laatst online: 04-04 22:07

r0b

Unsupported subquery syntax:

ERROR 1235 (ER_NOT_SUPPORTED_YET)
SQLSTATE = 42000
Message = "This version of MySQL doesn't yet support
'LIMIT & IN/ALL/ANY/SOME subquery'"

This means that statements of the following form do not work, although this happens only in some early versions, such as MySQL 4.1.1:
Die laatste zin laat mij denken dat het in > 4.1.1 wel werkt.
In 4.1.13 werkt het ook niet, helaas dus.

[ Voor 10% gewijzigd door r0b op 03-08-2005 16:52 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:44
cannibal74 schreef op woensdag 03 augustus 2005 @ 16:50:
Maar een select van meerdere rijen in de "select-clause" werkt volgens mij nergens hoor
Hmm, idd. Ik heb het net ff in sql server getest, en daar lukt het ook niet.
Vreemd, ik dacht nochtans dat ik dit ooit eens gedaan had....

https://fgheysels.github.io/

Pagina: 1