Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno SQL - spojenie dvoch tabuliek, z druhej posledné záznamy

Mám tabuľku tab1 a tabuľku tab2, ktorá odkazuje na tab1 pomocou výrazu

tab2.tab1_id = tab1.id

Potrebujem prepojiť tieto dve tabuľky tak, aby položka tab2.cas bola najvyššia pre každé tab2.tab_id

Takže mám:

select * from tab1 left join tab2 on tab1.id=tab2.tab1_id group by tab1.id

Týmto dosiahnem, že mi zobrazí všetky riadky z tab1 a ak neexistuje nijaký záznam podľa prepojenia, tak v druhej časti je null, to je v poriadku, lenže záznam z tab2 je náhodný a nie taký, čo má najvyššiu položku tab2.cas.

Toto mi nepomáha:

select * from tab1 left join tab2 on tab1.id=tab2.tab1_id where tab2.cas=max(tab2.cas) group by tab1.id
Předmět Autor Datum
CREATE VIEW V_TAB2 AS SELECT TAB1_ID, MAX(CAS) AS CAS FROM TAB2 GROUP BY TAB1_ID; a potom SELECT *…
wam_Spider007 03.02.2010 20:07
wam_Spider007
Naraz sa to nedá napísať do jedného príkazu? Ale nevadí, myslím, že to pomôže.
msx. 03.02.2010 20:09
msx.
mozes este takto: SELECT T1.*, MAX(T2.CAS) AS CAS FROM TAB1 T1 LEFT JOIN TAB2 T2 ON T1.ID = T2.TAB1…
wam_Spider007 03.02.2010 20:13
wam_Spider007
Jasné, to mi došlo potom, že sa to dá vnoriť.
msx. 03.02.2010 20:29
msx.
a funguje to? pisal som to z hlavy...neskusal som to na realnych datach :-D.
wam_Spider007 03.02.2010 20:31
wam_Spider007
SELECT *, MAX(cas) AS maxcas FROM tab2 GROUP BY tab1_id; HAVING cas=maxcas Dáva prázdnu tabuľku. I…
msx. 03.02.2010 20:27
msx.
no tento script je dost nespravny....za normalnych okolnosti by dokonca jeho spustenie mali vypisat…
wam_Spider007 03.02.2010 20:30
wam_Spider007
Ide to, presne to som potreboval, ale keď som chcel pridať počet príspevkov, tak to už neviem zas do…
msx. 03.02.2010 20:38
msx.
to uz asi jednym prikazom neurobis... musis si urobit view, ktore ti da pre kazde ID pocet riadkov…
wam_Spider007 03.02.2010 20:43
wam_Spider007
Vyzerá, že to ide dobre, ale potrebujem, aby sa zobrazili všetky riadky z TAB1, aj tie, pre ktoré ne…
msx. 03.02.2010 21:01
msx.
takze final...snad :-D SELECT * FROM TAB1 T1 LEFT JOIN TAB2 T2 ON T1.ID = T2.TAB1_ID LEFT JOIN V_PR…
wam_Spider007 03.02.2010 21:07
wam_Spider007
To ako robíš, už som to sám začal skúšať a stále nič. Tak, reku, skúsim pozrieť, či si už odpísal a…
msx. 03.02.2010 21:08
msx.
Stále rovnaké. Nullové záznamy sú fuč.
msx. 03.02.2010 21:10
msx.
no nic, idem si to skusit....takto z hlavy sa to blbo robi :-D
wam_Spider007 03.02.2010 21:14
wam_Spider007
Beriem späť. Keď som si to celé pozeral v phpMyAdmine, tak sa mi zdalo, že mám zle zátvorku. Pozrel…
msx. 03.02.2010 21:13
msx.
no problem :-) ked si napisal, ze aj tak nejde tak uz som zapinal mysql, ze si to nasimulujem....nas…
wam_Spider007 03.02.2010 21:17
wam_Spider007
Práve som to otestoval, doplnil ďalšie podmienky a funguje bezchybne. Ďakujem, označujem za vyriešen… poslední
msx. 03.02.2010 21:41
msx.

mozes este takto:

SELECT T1.*, MAX(T2.CAS) AS CAS
FROM TAB1 T1
LEFT JOIN TAB2 T2
ON T1.ID = T2.TAB1_ID
GROUP BY T1.*;

samozrejme T1.* budes musiet nahradit normalnym zoznamom stlpcov T1.stlpec1, T1.stlpec2...etc. aj v group by klauzule

pripadne este:

SELECT *
FROM TAB1 T1
LEFT JOIN TAB2 T2
ON T1.ID = T2.TAB1_ID
WHERE T2.CAS = (SELECT MAX(CAS) FROM TAB2 WHERE TAB1_ID = T1.ID)
SELECT *, MAX(cas) AS maxcas
FROM tab2
GROUP BY tab1_id;
HAVING cas=maxcas

Dáva prázdnu tabuľku. Ide o to, že potrebujem aj všetky stĺpce z tab2.

Doplnenie:
Ide o komentáre k témam. Témy sa musia zobraziť všetky a vedľa každej aj dátum a čas a meno používateľa posledného príspevku, tab1 je téma, tab2 sú komentáre.

no tento script je dost nespravny....za normalnych okolnosti by dokonca jeho spustenie mali vypisat chybu
v GROUP BY klauzule musi byt rovnaky pocet neagregovanych poli ako je v SELECT liste.

ak potrebujes aj stlpce z TAB2 tak skus ten skript, ktory som poslal posledny

to uz asi jednym prikazom neurobis...

musis si urobit view, ktore ti da pre kazde ID pocet riadkov

CREATE VIEW V_PRIADKOV
AS
SELECT TAB1_ID, COUNT(*)
FROM TAB2
GROUP BY TAB1_ID;

a select potom este doplnis

SELECT *
FROM TAB1 T1
LEFT JOIN TAB2 T2
ON T1.ID = T2.TAB1_ID
LEFT JOIN V_PRIADKOV PR
ON PR.TAB1_ID = T1.ID
WHERE T2.CAS = (SELECT MAX(CAS) FROM TAB2 WHERE TAB1_ID = T1.ID)

Zpět do poradny Odpovědět na původní otázku Nahoru