Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Mysql dotaz složitější - jde to ?

Zdar, mám tu jednu takovou složitost. Chtěl bych poskládat dotaz takto: vybere z tabulky a všechyn sloupce místo toho aby vrátil číslo (v jednom sloupci, v druhém mám druhy jeden sloupeček id druhy názvy) by vrátil název toho druhu. Jde to, nebo se to musí dělat na několikrát ? Díky za pomoc.

Předmět Autor Datum
select t1.pole1, t1.pole2, t1.pole3, t2.nazov from tabulka1 t1 inner join tabulka2 t2 on t1.id = t2.…
wam_Spider007 14.09.2010 20:48
wam_Spider007
No takže ja som si tú Tvoju zlátaninu prečítal asi 3x, ale aj tak som presne nepochopil čo chceš...…
pme 14.09.2010 20:48
pme
Složitější? Tohle je úplný základ, kup si nějakou knížku. SELECT a.sloupec1, a.sloupec2, b.nazev FR…
Wikan 14.09.2010 20:49
Wikan
Zkusím ještě jednou. Mám 2 tabulky, v jedné nějaké data, v druhé jsou kategorie očíslované id a náze…
mati 14.09.2010 21:04
mati
Skúšal si aplikovať odpovede, ktoré si dostal? ;-) select z.nazev, k.nazev from knihy k inner join…
los 14.09.2010 21:08
los
Hurá :-) po troše trápení (12 min) jsem to rozchodil. Můžeš mi to vysvětlit ? Jak to chápu: select…
mati 14.09.2010 21:25
mati
Písmená k a z sú aliasy - pomenoval som nimi tabuľky knihy a zanry tým, že som napísal from knihy k…
los 14.09.2010 21:30
los
a este doplnim, pred nazvy stlpcov sa pisu nazvy tabuliek (pripadne spominane aliasy) hlavne preto,…
wam_Spider007 14.09.2010 21:35
wam_Spider007
Tak díky hlavně losovi :beer:. Asi si budu muset koupit knihu mysql/php, protože čím dělám složitějš…
mati 14.09.2010 21:49
mati
lamp.fornax.sk - pekný článok, skús si prečítať
pme 14.09.2010 21:24
pme
Pro inspiraci jeden z mých běžných dotazů (plně funkční!): SELECT NI.CisloRozhodnuti, NI.IDosoba, M…
Rce 14.09.2010 23:09
Rce
zaujimave, ale obavam sa, ze ak by v tom chcel niekto iny (mimo teba) urobit upravu ci zmenu, tak ne…
wam_Spider007 14.09.2010 23:40
wam_Spider007
Není tady prostor abych zde rozpitvával zadání. Spojení tabulek je pak celkem logické a ty vložené s…
Rce 15.09.2010 00:17
Rce
Výsledok zlého návrhu databázy...
los 15.09.2010 00:28
los
Ani taky ne. Ne vždy jde navrhnout databáze "na všechno". Návrh databáze jsem nedělal já. Je to z in… poslední
Rce 15.09.2010 01:42
Rce
select t1.pole1, t1.pole2, t1.pole3, t2.nazov
from tabulka1 t1
inner join tabulka2 t2
on t1.id = t2.id_t2

myslis klasicky inner join dvoch tabuliek? alebo to skus popisat trochu zrozumitelnejsie - tvoj popis je s prepacenim trochu po madarsky.

Zkusím ještě jednou. Mám 2 tabulky, v jedné nějaké data, v druhé jsou kategorie očíslované id a název. Potřebuju, aby mysql vrátila místo sloupce s číslama dosazený do té drugé tabulky.

Příklad:

zanry

id nazev
1 sportovní
2 dokumentární

knihy

zanr název
2 Shakespeare
1 Lind

Při obyčejném selectu by mi Myqsl vrátil v prvním řádku 2 a shakespeare. Dá se to poskládat aby vracela dokumentární a Shakespeare? (jen jako příklad ;))

Hurá :-) po troše trápení (12 min) jsem to rozchodil. Můžeš mi to vysvětlit ? Jak to chápu:

select (lib pismeno např z).nazev, (lib pismeno např k).nazev ("název" jsou jména tech sloupečků)
from knihy(jméno tabulky od k knihy) k(to pismeno - k čemu to je?)
inner join zanry(jmeno tabulky od z - zanry) z on z.id=k.zanr (teď už nevím)

Písmená k a z sú aliasy - pomenoval som nimi tabuľky knihy a zanry tým, že som napísal from knihy k a join zanry z. Šlo by to aj bez nich, ale to by sa človek upísal v prípade, že by názvy tabuliek boli dlhšie.

Napr. bez aliasov by to vyzeralo takto:

select zanry.nazev, knihy.nazev
from knihy
inner join zanry on zanry.id=knihy.zanr

a este doplnim, pred nazvy stlpcov sa pisu nazvy tabuliek (pripadne spominane aliasy) hlavne preto, ze sa moze stat, ze rovnaky nazov stlpca moze byt v oboch tabulkach.

PS: vobec nie je zle si nastudovat nejaky manual. Aspon na taketo zaklady ohladne selectov. Prikaz select ma mnozstvo variacii pouzitim klauzul a joinov.

Pro inspiraci jeden z mých běžných dotazů (plně funkční!):

SELECT NI.CisloRozhodnuti, NI.IDosoba, MIN(NI.Podil) AS Podil, MIN(NI.UPcislo) AS UPcislo, 
      SUM(ISNULL(Z1.Kc, 0) + ISNULL(Z2.Kc, 0) + ISNULL(Z3.Kc, 0) + ISNULL(Z4.Kc, 0) + ISNULL(Z5.Kc, 0) + ISNULL(Z6.Kc, 0) - isnull (Z7.Kc, 0)) AS Celkem
    FROM    (
            SELECT min (N.Par) as Par, N.CisloRozhodnuti, I.IDosoba, SUM(I.Pomer1 * N.Hodnota / I.Pomer2) AS Podil, MIN(N .UPcislo) AS UPcislo 
                    FROM NarPozemky_N N INNER JOIN IDOOPOZ I ON N.CisloRozhodnuti = I.CisloRozhodnuti AND N.CisloPozemku = I.CisloPozemku AND N .UPcislo = I.UPcislo
                    WHERE ' + PutUpCislo ('N', true) + ' AND (N .Par = ' + IntToStr (SrPar) + ') AND (I.Pomer2 <> 0) 
                    GROUP BY N.CisloRozhodnuti, I.IDosoba
            ) NI
    LEFT OUTER JOIN
        (SELECT IDOsoba, CisloRozhodnuti, UPcislo, Par, SUM(Kc) AS Kc FROM Blok11Zdroj GROUP BY IDOsoba, CisloRozhodnuti, UPcislo, Par) Z1
            ON NI.CisloRozhodnuti = Z1.CisloRozhodnuti AND NI.IDosoba = Z1.IDOsoba AND NI.UPcislo = Z1.UPcislo and NI.Par = Z1.Par
            LEFT OUTER JOIN
                (SELECT IDOsoba, CisloRozhodnuti, UPcislo, Par, SUM(Kc) AS Kc FROM LesyZdroj GROUP BY IDOsoba, CisloRozhodnuti, UPcislo, Par) Z2
            ON NI.CisloRozhodnuti = Z2.CisloRozhodnuti AND NI.IDosoba = Z2.IDOsoba AND NI.UPcislo = Z2.UPcislo and NI.Par = Z2.Par
            LEFT OUTER JOIN
                (SELECT IDOsoba, CisloRozhodnuti, UPcislo, Par, SUM(Kc) AS Kc FROM MZEZdroj GROUP BY IDOsoba, CisloRozhodnuti, UPcislo, Par) Z3
            ON NI.CisloRozhodnuti = Z3.CisloRozhodnuti AND NI.IDosoba = Z3.IDOsoba AND NI.UPcislo = Z3.UPcislo and NI.Par = Z3.Par
            LEFT OUTER JOIN
                (SELECT IDOsoba, CisloRozhodnuti, UPcislo, SUM(Kc) AS Kc FROM Vec11Zdroj GROUP BY IDOsoba, CisloRozhodnuti, UPcislo) Z4
            ON NI.CisloRozhodnuti = Z4.CisloRozhodnuti AND NI.IDosoba = Z4.IDOsoba AND NI.UPcislo = Z4.UPcislo
            LEFT OUTER JOIN
                (SELECT IDOsoba, CisloRozhodnuti, UPcislo, SUM(Kc) AS Kc FROM Zap11Zdroj GROUP BY IDOsoba, CisloRozhodnuti, UPcislo) Z5
            ON NI.CisloRozhodnuti = Z5.CisloRozhodnuti AND NI.IDosoba = Z5.IDosoba AND NI.UPcislo = Z5.UPcislo 
            LEFT OUTER JOIN 
                (SELECT IDOsoba, CisloRozhodnuti, UPcislo, SUM(Kc) AS Kc FROM ChybPln11Zdroj GROUP BY IDOsoba, CisloRozhodnuti, UPcislo) Z6
            ON NI.CisloRozhodnuti = Z6.CisloRozhodnuti AND NI.IDosoba = Z6.IDOsoba AND NI.UPcislo = Z6.UPcislo
            left outer join
                (SELECT MIN(PZ.UPcislo) AS UPcislo, A.IDOsoba, PZ.CisloRozhodnuti, SUM(PZ.Kc) AS Kc
                    FROM   Post11Zdroj PZ
                    INNER JOIN Post11  P ON PZ.UPcislo = P.UPcislo AND PZ.IDPrevod = P.IDPrevod AND PZ.IDosoba = P.IDosoba
                        INNER JOIN ADRESAR A ON PZ.UPcislo = A.UPcislo AND P.KlientID_Prev = A.KlientID
                    GROUP BY A.IDOsoba, PZ.CisloRozhodnuti) Z7
            on NI.CisloRozhodnuti = Z7.CisloRozhodnuti AND NI.IDosoba = Z7.IDOsoba AND NI.UPcislo = Z7.UPcislo
                         'GROUP BY NI.CisloRozhodnuti, NI.IDosoba
    HAVING (SUM(ISNULL(Z1.Kc, 0) + ISNULL(Z2.Kc, 0) + ISNULL(Z3.Kc, 0) + ISNULL(Z4.Kc, 0) + ISNULL(Z5.Kc, 0) + ISNULL(Z6.Kc, 0) - isnull (Z7.Kc, 0)) > MIN(NI.Podil) + 0.99) 

zaujimave, ale obavam sa, ze ak by v tom chcel niekto iny (mimo teba) urobit upravu ci zmenu, tak nema sancu a skorej napise novy select.
kebyze po niekom najdem v praci takyto kod, tak mu odrapim ruky. je to dost neprehladne (hlavne kvoli tym substituciam pomocou selectov) a zbytocne sa tam pouziva OUTER. verim, ze pouzitim funkcii, view (a pokial je to MS SQL tak aj with) by sa tento select zmestil na par riadkov.

Není tady prostor abych zde rozpitvával zadání. Spojení tabulek je pak celkem logické a ty vložené selecty IMHO to naopak zjednodušují pro jiného, protože je přesně na místě ucelený select. Je to názornější, než dělat nejprve pomocné přechodné tabulky. Původně to bylo určeno pro MS SQL, cílem byla tisková sestav v Delphi. Samozřejmě, není to jediné možné řešení a věřím, že co programátor, to jiné neméně dobré řešení.

Ani taky ne. Ne vždy jde navrhnout databáze "na všechno". Návrh databáze jsem nedělal já. Je to z inventury nároků na restituci, kde bylo strašlivě moc variant - měl pole, dali za to barák + peníze nebo les, nemovitosti, prostě kvanta možností a jejich kombinace. Tento obří select vyhledával chyby v databázi tedy nepovolené kombinace nároků a plnění restitucí. Vnitřní selecty vytahují chybné věty a "obalový" select to vhodně seřadí a vysoučtuje.

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