Avatar billede plato Juniormester
15. november 2018 - 20:04 Der er 11 kommentarer

Hent sidste værdi fra joined table incl. group by & sub query

Uanset hvordan jeg vender og drejer det, så kan jeg simpelthen ikke vise alle Cat_Name og under Cat_Name vil jeg så gerne have vist seneste indsat topic fra den joined tabel topics.

Cat_ID    Cat_Name
    1              Cat1
    2              Cat2
    3              Cat3

Topic_ID    Topic_Name    Cat_ID
    1                  Topic1          1
    2                  Topic2          2
    3                  Topic3          1
    4                  Topic4          3
    5                  Topic5          3
    6                  Topic6          3

Nu vil jeg gerne have et udtræk der hedder:

Cat1      Topic3
Cat2      Topic2
Cat3      Topic6

Mine tabeller:

Hoved tabel:
categories
__________________________
Cat_ID (int)           
Cat_Name (varchar)
Cat_Description (varchar)
Cat_Sorting (int)

Joined tabel:
topics
_________________________
Topic_ID
Topic_Name
Cat_ID

Mit seneste forsøg:
SELECT * FROM (SELECT c.Cat_ID, c.Cat_Name, t.Topic_ID, t.Topic_Date, t.Topic_Name, t.Cat_ID FROM categories AS c LEFT JOIN topics AS t ON t.Cat_ID=c.Cat_ID ORDER BY t.Topic_ID DESC) AS sub GROUP BY sub.Cat_ID ORDER BY sub.Cat_ID DESC

Nogen idéer til hvad jeg gør forkert?
Avatar billede plato Juniormester
15. november 2018 - 20:08 #1
Ændring, min nuværende sql er:

SELECT * FROM (SELECT c.Cat_ID, c.Cat_Name, t.Topic_ID, t.Topic_Date, t.Topic_Name FROM categories AS c LEFT JOIN topics AS t ON c.Cat_ID=t.Cat_ID ORDER BY t.Topic_ID DESC) AS sub GROUP BY sub.Cat_ID ORDER BY sub.Cat_ID DESC
Avatar billede arne_v Ekspert
15. november 2018 - 20:25 #2
Proev:

SELECT categories.cat_name, t1.topic_name
FROM categories JOIN topics t1 ON categories.cat_id = t1.cat_id
WHERE t1.topic_id IN (SELECT MAX(t2.topic_id) FROM topics t2 WHERE t2.topic_id = t1.topic_id)
Avatar billede arne_v Ekspert
15. november 2018 - 20:42 #3
IN maa kunne erstattes af =
Avatar billede plato Juniormester
15. november 2018 - 20:42 #4
Det giver desværre slet ingen udtræk. Ingen fejl, men heller ingen resultater.
Avatar billede arne_v Ekspert
15. november 2018 - 20:46 #5
WHERE t2.topic_id = t1.topic_id)

->

WHERE t2.cat_id = t1.cat_id)

?
Avatar billede plato Juniormester
15. november 2018 - 21:19 #6
Samme resultat desværre. Har stirret mig blind i flere timer. :-/
Avatar billede arne_v Ekspert
15. november 2018 - 21:28 #7
SELECT categories.cat_name, t1.topic_name
FROM categories JOIN topics t1 ON categories.cat_id = t1.cat_id
WHERE t1.topic_id = (SELECT MAX(t2.topic_id) FROM topics t2 WHERE t2.cat_id = t1.cat_id)

virker ikke?
Avatar billede plato Juniormester
16. november 2018 - 07:55 #8
Gik den lige efter igen og den virker. Dvs. den trækker data ud, men den lister alt fra categories, hvor den f.eks kun burde liste ét fra "Generelt":
https://ibb.co/kUDTjf
Avatar billede acore Ekspert
16. november 2018 - 11:43 #9
Hvad med

SELECT a.Cat_Name, tt.Topic_Name FROM
(SELECT Cat_ID, Cat_Name, MAX(Topic_ID) as maxx FROM topics AS t
LEFT JOIN categories AS c USING (Cat_ID)
GROUP BY Cat_ID) AS a
LEFT JOIN topics AS tt ON (a.maxx=tt.Topic_ID)
Avatar billede plato Juniormester
16. november 2018 - 12:08 #10
Det virker! :-) Har du mulighed for at tilføje sorting fra categories med Cat_Sorting & den skal tage categories med, hvor der ingen topics er (Altså Null fra Topics)?
Avatar billede acore Ekspert
16. november 2018 - 14:01 #11
Dem uden Topics burde i princippet kunne fanges ved at skifte fra LEFT JOIN til RIGHT OUTER JOIN.

Sortering kan klares med en ORDER BY...

Har ikke lige tid til at teste og finpudse det nu
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

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