Avatar billede it-interesseret Nybegynder
14. september 2008 - 10:37 Der 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.
Avatar billede gnoname Praktikant
15. september 2008 - 08:58 #1
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
Avatar billede it-interesseret Nybegynder
15. september 2008 - 16:38 #2
Tak for bidraget :-)

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.

Hvad kan være galt?
Avatar billede it-interesseret Nybegynder
15. september 2008 - 16:39 #3
sub-selected = sub-selecten
Avatar billede gnoname Praktikant
15. september 2008 - 21:13 #4
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
Avatar billede it-interesseret Nybegynder
15. september 2008 - 22:34 #5
Desværre også tom.
Avatar billede gnoname Praktikant
16. september 2008 - 00:24 #6
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
Avatar billede it-interesseret Nybegynder
16. september 2008 - 08:14 #7
Den første giver 195 records.

Og den næste - med en limit - giver præcist det, som jeg spurgte om :-)

Mange tak for hjælpen :-)
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