14. september 2008 - 10:37Der er
5 kommentarer og 2 løsninger
Unikt udtræk?
Hej alle
Jeg er ikke super til SQL, så dette er sikkert et let spg.
Jeg skal have et udtræk, som finder kategori ID værdier, på de seneste publicerede artikler (content), men det skal være hvor kategori ID værdierne er unikke, og det kan jeg squ ik finde u’a.
Her er fælles SQL’en: publish_up is not null and catid != 119 and created < curdate() order by created desc limit 0,10
Hvis jeg kører denne: SELECT catid from #__content where [FÆLLES SQL]
Så kommer der det korrekte udtræk, dog med dubletter, hvorimod hvis jeg kører:
SELECT distinct catid from #__content where [FÆLLES SQL]
Så er der godt nok ingen dupletter, men omvendt er det nu et forkert udtræk (af kategorier med noget content som ikke er aktuelt).
Har også prøvet med SELECT catid from #__content where ..... group by catid ....
Men det bliver det samme forkerte udtræk som ved distinct.
Så har jeg også prøvet: SELECT id as catid from #__categories where id in (select catid from #__content where [FÆLLES SQL])
Men der står min MySQL 5 af på og siger, at det kan man endnu ikke i MySQL. Den fejler på limit delen i sub-select'en.
Så har jeg prøvet med left join samt med having, men de giver det samme som ved distinct (og group by).
Så jeg er lidt lost her – nogle som kan gennemskue det?
Jeg skal blot have et udtræk af de kategorier, som de 10 seneste artikler ligger i, uden kategori-dupletter. Kategorier-værdierne skal listes sådan, at den seneste artikels kategoriID kommer først osv.
select catid from ( select catid, max(created) from #__content where publish_up is not null and catid != 119 and created < curdate() group by catid order by max(created) desc) limit 0, 10
Den siger: "Every derived table must have its own alias"
Man så satte jeg et "as" ind, hvorved fejlen forsvinder, men den får ikke noget i sit udtræk. Hvis jeg kører sub-selected alene giver det heller ikke noget udtræk.
Prøv dette (MySql er åbenbart lidt krakilsk omkring aliaser):
select catid from ( select catid, max(created) as latest from #__content where publish_up is not null and catid != 119 and created < curdate() group by catid order by latest desc) as latestposts limit 0, 10
Giver dette noget (og hvis ikke er der jo ingen rækker i din tabel, der opfylder betingelserne):
select catid, created from #__content where publish_up is not null and catid != 119 and created < curdate()
så bør dette også give noget:
select catid, max(created) as latest from #__content where publish_up is not null and catid != 119 and created < curdate() group by catid order by latest desc
Og den næste - med en limit - giver præcist det, som jeg spurgte om :-)
Mange tak for hjælpen :-)
Synes godt om
Ny brugerNybegynder
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.