Ik heb een setje tabellen waaruit ik een klein gedeelte data wil pakken te weten:

+ = table, - = column

+adres
-id
-adres (unique)
-plaats

+vermelding
-id
-adres_id
-info
-source_id
-adddate

+sources
-id
-name
-rank

Stel dat ik 2 maal een vermelding heb voor 1 adres, dan wil ik de vermelding tonen waarvan de source_id de hoogste rank heeft, en daarna sorteren op adddate binnen de overgebleven vermeldigen .

Als ik nu echt een query pak als deze:

select 
					adressen.adres ,
					adressen.id as adres_id,
					vermeldingen.adddate as adddate,
					sources.rank as source_rank,
					sources.name as source_name,
				from 
					adressen,
					vermeldingen,
					sources
				where 
					vermeldingen.adres_id=adressen.id and 
					adressen.plaats_id=1 and
					sources.id=vermeldingen.source_type

			  order by sources.rank desc, vermeldingen.prijs desc
   
				limit 0,20


Dan geeft hij netjes alle juiste adressen terug, maar ook 2 maal de vermelding voor het adres met 2 vermeldingen.
Als ik echter een group by vermeldingen.adres_id voor de order by invoeg krijg ik de verkeerde vermelding terug, de sortering op sources.rank doet z'n werk dan niet meer.
Als ik de group by achter de order by stop doet ie t niet meer en krijg ik een sql error.

Heeft iemand een idee of dit op te lossen is?

select 
     distinct(a.adres) ,
     distinct(a.id as adres_id),
     distinct(v.adddate as adddate),
     distinct(s.rank as source_rank),
     distinct(s.name as source_name)
from 
     adressen a,
     vermeldingen v,
     sources s
where 
     v.adres_id=a.id 
and 
    a.plaats_id=1 
and
    s.id=v.source_type
order by 
    s.rank desc,
   v.prijs desc
limit 0,20


Tip zet je SQL KEY WORDS in hoofdletters, dus
SELECT FROM WHERE ORDER enz....

[edit]
niet goed gelezen
[edit]

Volgens mij kan diet niet met een query. Het kan echter wel met een FUNCTIE ik weet alleen niet precies hoe.
Het probleem is dat je bij het selecteren al gegevens nodig hebt die je nog niet hebt.
dan wil ik de vermelding tonen waarvan de source_id de hoogste rank heeft, en daarna sorteren op adddate binnen de overgebleven vermeldigen
Zoals Klaasjan al zegt, is dit inderdaad niet mogelijk en wel om de volgende reden.

De hoogste source_id rank is een eigenschap van een groep records behorende bij 1 adres. Je zult dus moeten gaan groeperen door een GROUP BY in je query op te nemen. Als direct gevolg is het niet meer mogelijk om de individuele records uit die groep aan te spreken, dus het sorteren van de overige records gaat niet.

Reageren