Autor Zpráva
Sxmanek
Profil
Prosím o změnu nadpisu, nechtěl jsme zakládat nové téma, tak jsem pouze upravil staré na které jsem přišel sám.

Zdravím, potřeboval bych poradit ohledně jedné věci.

Mám tabulku typu:
ID         JMENO           PRIJMENI     ID_MATKY     ID_OTCE
1           Ilona             Hornikova     2            3
2          Martina            Horalova      -            - 
3           Jarda                Carda      -            -

Teď jsem si z toho udělal tabulku pomoci
SELECT CONCAT(CONCAT(JMENO, ' '), PRIJMENI) AS DITE, ID_MATKY AS MATKA, ID_OTCE AS OTEC FROM LIDE WHERE ID_MATKY IS NOT NULL AND ID_OTCE IS NOT NULL  ORDER BY ID_MATKY ASC, ID_OTCE ASC,DITE ASC;


    DITE              MATKA                           OTEC
Ilona Horniko          2                               3            (MÁM)
Ilona Horniko         Martina Horalova            Jarda Carda      (POTŘEBUJI)

a ty ID matky a otce potřebuji zase nahradit jmény z té první tabulky. Nevíte jak na to. Díky
Lamicz
Profil
Spojení (JOIN) tabulek přes ID_MATKY a ID_OTCE na matku resp. otce.
Sxmanek
Profil
tak jsem koukal na self-join a zkoušel jsem se s tím nějak porvat a dokonce jsem to dělal přesně krok za krokem podle videa a stejně mi to nejde

SELECT L.JMENO AS DITE,M.JMENO AS MATKA FROM LIDE L LEFT JOIN LIDE M ON L.ID_CLOVEK = M.ID_MATKY;

nechápu jak mu to v tom videu může fungovat, dyť tam žádnou tabulku E a M nemá, pokud se nevytvoří tím tblEmployee E...

mě to píše "L"."ID_CLOVEK": neplatný identifikátor
juriad
Profil
SELECT d.jmeno AS dite, m.jmeno AS matka, o.jmeno AS otec
FROM lide AS d # d jako dite
LEFT JOIN lide AS m # m jako matka
  ON d.id_matky = m.id
LEFT JOIN lide AS o # o jako otec
  ON d.id_otce = o.id

Klíčová slova jsem napsal velkými písmeny, příjde mi to tak přehlednější.
Slovo AS znamená přejmenování; toto klíčové slovo není zpravidla (u databází, které potkáš) povinné a tak se většinou nepíše.

V rámci jednoho dotazu můžeš použít jednu tabulku vícekrát, ale musíš ji pokaždé jinak pojmenovat (pomocí toho AS, které nemusíš uvádět).
Pak se to tváří jako by to byla úplně jiná tabulka.

LEFT JOIN jsem použil z důvodu, že dítě nemusí mít některé(ho) rodiče. Pokud bys chtěl jen takové osoby, které mají oba rodiče, odstraň z dotazu slovo LEFT.
Nebo to můžeš vyřešit podmínkou WHERE ... IS NOT NULL, jak jsi to udělal ty. Ale přijde mi to méně přehledné (slovo LEFT u JOINu znamená: bacha, nemusí existovat).

Další otázkou je, zda provádět CONCAT už v databázi. Aplikace tím přijde o inforamaci, co je jméno a co je příjmení. Lepší by to mohlo být spojit až v PHP při výpisu šablony; tak se můžeš snadno rozhodnout zda jméno a příjmení oddělíš mezerou, nebo je raději napíšeš ve formátu příjmení, jméno.
Sxmanek
Profil
Jelikož jsem se dočetl a také ověřil, že ORACLE nepodporuje to AS, když si chci takto definovat tabulky, tak jsem je smazal.
Co se týče otázky na konci, tak budu muset použít CONCAT, jelikož s tím v PHP pracovat nebudu.
Pěkně vysvětleno a díky moc.

Teď už jen spočítat kolik má daný pár dětí. Šlo by to udělat nějak pomocí COUNT(*), kde by se pro každý řádek vypočítal počet ID ve sloupci ID_MATKA. Vím jak to udělat na pevno, že zadám podmínku na jméno a příjmení, jenže to mi vypíše do všech řádků, stejný počet dětí.
Kajman
Profil
Sxmanek:
jsem se dočetl a také ověřil, že ORACLE nepodporuje to AS
A kde jsme se mohli dočíst, že používáte oracle?

Teď už jen spočítat kolik má daný pár dětí.
select l.id_matky, l.id_otce, count(*) deti
from   lide l
group  by l.id_matky, l.id_otce
Sxmanek
Profil
Moje chyba, omlouvám se. Jinak díky moc, přeji pěkný den :)
Sxmanek
Profil
Může mi někdo poradit jak u toho počtu dětí dát místo ID žen a mužů jejich jména, myslel jsem si že jsem to pochopil z první části, ale očividně ne. Vždy mi to vypíše že příkaz není ukončen nebo že nejde použít ORDER BY.
juriad
Profil
A co kdybys ukázal svůj dotaz, kam až jsi dospěl (byť nefunguje). Ono se mi moc nechce ti rovnou napsat aniž bych viděl, že se sám snažíš.
Sxmanek
Profil
SELECT CONCAT(CONCAT(z.JMENO, ' '), z.PRIJMENI) AS ZENA, CONCAT(CONCAT(m.JMENO, ' '), m.PRIJMENI) AS MUZ, COUNT(*) DETI FROM A_CLOVEK.LIDE l JOIN A_CLOVEK.LIDE z ON l.id_matky = z.ID JOIN A_CLOVEK.LIDE m ON l.id_otce = m.ID GROUP BY l.ID_MATKY, l.ID_OTCE ORDER BY DETI desc;
Kajman
Profil
Nejjednudušší je uvést použité sloupce ze selectu i v group by části, tak jak vás asi informovala chyba...

SELECT Concat(z.jmeno, ' ', z.prijmeni) AS ZENA,
       Concat(m.jmeno, ' ', m.prijmeni) AS MUZ,
       Count(*)                         DETI
FROM   a_clovek.lide l
       join a_clovek.lide z
         ON l.id_matky = z.id
       join a_clovek.lide m
         ON l.id_otce = m.id
GROUP  BY l.id_matky,
          l.id_otce,
          z.jmeno,
          z.prijmeni,
          m.jmeno,
          m.prijmeni
ORDER  BY deti DESC;  
Sxmanek
Profil
Díky moc, jsem měl za to, že když mě to odkazovalo na SELECT, tak že mám ten blbě... Můžete lock a ještě jednou díky.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: