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 |
#2 · Zasláno: 7. 4. 2014, 22:49:14
Spojení (JOIN) tabulek přes ID_MATKY a ID_OTCE na matku resp. otce.
|
||
Sxmanek Profil |
#3 · Zasláno: 7. 4. 2014, 23:58:24
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 |
#6 · Zasláno: 8. 4. 2014, 10:01:43
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 |
#7 · Zasláno: 8. 4. 2014, 10:17:42
Moje chyba, omlouvám se. Jinak díky moc, přeji pěkný den :)
|
||
Sxmanek Profil |
#8 · Zasláno: 9. 4. 2014, 11:10:51
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 |
#9 · Zasláno: 9. 4. 2014, 11:24:29
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 |
#11 · Zasláno: 9. 4. 2014, 13:32:54
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 |
#12 · Zasláno: 9. 4. 2014, 13:44:06
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.
|
||
Časová prodleva: 11 let
|
0