Avatar billede phliplip Nybegynder
23. februar 2006 - 09:41 Der er 4 kommentarer og
2 løsninger

SQL: Max og Min

Hej igen!

Har følgende:

SELECT GREATEST(MAX(partner_services.cpc), MAX(partner_services_filter.cpc)) AS maxcpc, LEAST(MIN(partner_services.cpc), MIN(partner_services_filter.cpc)) AS mincpc FROM partner INNER JOIN partner_services ON partner.id=partner_services.partner_id AND partner_services.type_id='".$type_id."' LEFT JOIN partner_services_filter ON partner.id=partner_services_filter.partner_id AND partner_services_filter.type_id='".$type_id."' AND ((partner_services_filter.country_id='".$country_id."' AND partner_services_filter.city='') OR (partner_services_filter.country_id='".$country_id."' AND partner_services_filter.city='".$city."')) WHERE partner.status_id='1' ORDER BY partner_services_filter.city DESC

Det den skulle gøre er at finde MAX(cpc) værdi fra partner_services og MAX(cpc) HVIS angivet i partner_services_filter, og så returnere den højeste af de to.. det samme er gældende på MIN(cpc).

Det jeg får ud er kun MAX() på partner_services men der er angivet en i partner_services_filter som er højere.

Ved godt det kan være lidt rodet at kigge på men håber i forstod hvad jeg mente!

Har også prøvet denne (som virker perfekt i andre sammenhæng) hvor det kun er det mellem SELECT og FROM jeg har skiftet ud!

SELECT GREATEST(MAX(partner_services.cpc), MAX(partner_services_filter.cpc)) AS maxcpc, LEAST(MIN(partner_services.cpc), MIN(partner_services_filter.cpc)) AS mincpc FROM partner INNER JOIN partner_services ON partner.id=partner_services.partner_id AND partner_services.type_id='".$type_id."' LEFT JOIN partner_services_filter ON partner.id=partner_services_filter.partner_id AND partner_services_filter.type_id='".$type_id."' AND ((partner_services_filter.country_id='".$country_id."' AND partner_services_filter.city='') OR (partner_services_filter.country_id='".$country_id."' AND partner_services_filter.city='".$city."')) WHERE partner.status_id='1' AND ((partner.id NOT IN (SELECT partner_filter.partner_id FROM partner_filter WHERE partner_filter.type_id='".$type_id."' AND partner_filter.country_id='".$country_id."' AND partner_filter.city='') AND partner.id NOT IN (SELECT partner_filter.partner_id FROM partner_filter WHERE partner_filter.type_id='".$type_id."' AND partner_filter.country_id='".$country_id."' AND partner_filter.city='".$city."'))) ORDER BY partner_services.cpc DESC, partner.created ASC, partner_services_filter.city DESC

Men der får jeg fejlen:
1140 (Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause)
Session halted.
Avatar billede phliplip Nybegynder
24. februar 2006 - 12:21 #1
Måske en smule for avanceret !? ;)
Avatar billede _darkstar_ Nybegynder
25. februar 2006 - 01:01 #2
Det er temmeligt svært at hjælpe, når du ikke formatterer din forespørgsel pænt. Desuden tror jeg godt at du kan smide størstedelen af den væk og stadigvæk have problemet.

Prøv at fjerne alle de tabeller der bliver joinet imod og se om ikke du får samme resultat. Det burde bliver til noget i stil med


SELECT GREATEST(
          MAX(partner_services.cpc),
          MAX(partner_services_filter.cpc)) AS maxcpc,
    LEAST(
          MIN(partner_services.cpc),
          MIN(partner_services_filter.cpc)) AS mincpc
FROM partner
ORDER BY partner_services.cpc DESC,
    partner.created ASC,
    partner_services_filter.city DESC

Så er det i hvert fald oplagt at ORDER BY-delen er meningsløs. Du har jo lige aggregeret over den, så felterne kommer ikke med ud.

Når du har fundet ud af at få ovenståend til at virke, kan du koble alle de andre joins på igen.
Avatar billede phliplip Nybegynder
27. februar 2006 - 10:10 #3
Hej _darkstar_!

Jeg fandt på noget andet ;)

Men du skal da ikke gå tomhændet fra at have formateret min SQL pænt.. er det ok med 15 point?

Mvh. Philip
Avatar billede phliplip Nybegynder
27. februar 2006 - 10:23 #4
Delte den op i 2 kald og brugte derefter PHP til at finde ud af hvilke værdier der skulle bruges!
Avatar billede phliplip Nybegynder
27. marts 2006 - 14:39 #5
Tager det som et ja!
Avatar billede _darkstar_ Nybegynder
27. marts 2006 - 15:04 #6
Ja. Jeg takker.
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