abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 04:33 | IT novinky

    Společnost Espressif (ESP8266, ESP32, …) získala většinový podíl ve společnosti M5Stack, čímž posiluje ekosystém AIoT.

    Ladislav Hagara | Komentářů: 0
    včera 23:44 | Nová verze

    Byla vydána nová stabilní verze 3.5 svobodného multiplatformního softwaru pro editování a nahrávání zvukových souborů Audacity (Wikipedie). Přehled novinek také na YouTube. Nově lze využívat cloud (audio.com). Ke stažení je oficiální AppImage. Zatím starší verze Audacity lze instalovat také z Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    včera 16:44 | Zajímavý článek

    50 let operačního systému CP/M, článek na webu Computer History Museum věnovaný operačnímu systému CP/M. Gary Kildall z Digital Research jej vytvořil v roce 1974.

    Ladislav Hagara | Komentářů: 0
    včera 16:22 | Pozvánky

    Byl zveřejněn program a spuštěna registrace na letošní konferenci Prague PostgreSQL Developer Day, která se koná 4. a 5. června. Na programu jsou 4 workshopy a 8 přednášek na různá témata o PostgreSQL, od konfigurace a zálohování po využití pro AI a vector search. Stejně jako v předchozích letech se konference koná v prostorách FIT ČVUT v Praze.

    TomasVondra | Komentářů: 0
    včera 03:00 | IT novinky

    Po 48 letech Zilog končí s výrobou 8bitového mikroprocesoru Zilog Z80 (Z84C00 Z80). Mikroprocesor byl uveden na trh v červenci 1976. Poslední objednávky jsou přijímány do 14. června [pdf].

    Ladislav Hagara | Komentářů: 6
    včera 02:00 | IT novinky

    Ještě letos vyjde Kingdom Come: Deliverance II (YouTube), pokračování počítačové hry Kingdom Come: Deliverance (Wikipedie, ProtonDB Gold).

    Ladislav Hagara | Komentářů: 4
    21.4. 19:11 | Komunita

    Thunderbird 128, příští major verze naplánovaná na červenec, přijde s nativní podporou Exchange napsanou v Rustu.

    Ladislav Hagara | Komentářů: 25
    21.4. 04:44 | Komunita

    Byly vyhlášeny výsledky letošní volby vedoucího projektu Debian (DPL, Wikipedie). Novým vedoucím je Andreas Tille.

    Ladislav Hagara | Komentářů: 7
    21.4. 00:11 | Nová verze

    Po osmi měsících vývoje byla vydána nová verze 0.12.0 programovacího jazyka Zig (GitHub, Wikipedie). Přispělo 268 vývojářů. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 2
    20.4. 23:55 | Pozvánky

    Poslední měsíc byl plný zajímavých akcí, o kterých Vám bastlíři z projektu MacGyver mohou povědět, protože se na ně sami vydali. Kde všude byli, ptáte se? Objevili se na Installfestu, Arduino Day, Hackaday Europe a tajném srazu bastlířů z Twitteru. A z každé akce pro vás mají zajímavé poznatky.

    … více »
    bkralik | Komentářů: 1
    KDE Plasma 6
     (71%)
     (10%)
     (2%)
     (18%)
    Celkem 674 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Dotaz: mysql join iba vtedy ak je hodnota jednej row ina ako 0

    6.2.2013 16:17 adrinko | skóre: 22
    mysql join iba vtedy ak je hodnota jednej row ina ako 0
    Přečteno: 507×
    ahojte, mam takyto mysql prikaz
        		SELECT o.user_id, o.date, i.*, k.adresa
        		FROM objednavky_items i
        		JOIN objednavky o ON (i.objednavka_id = o.id)
        		JOIN kontrolovanie k ON (i.item_id = k.id)
        		WHERE o.id = '$order_id' AND o.hash = '$order_hash' AND o.dokoncena = 'A'
    Problem je, ze by som chcel, aby sa JOIN kontrolovanie k ON (i.item_id = k.id) vykonalo a k.adresa naplnila len vtedy, ak i.item_id!=0

    Ako na to? Vdaka!

    Odpovědi

    6.2.2013 16:27 adrinko | skóre: 22
    Rozbalit Rozbalit vše Re: mysql join iba vtedy ak je hodnota jednej row ina ako 0
    zmodifikoval som to takto a zda sa, ze to vracia dobre vysledky
    SELECT o.user_id, o.date, i.*, k.adresa
    FROM objednavky_items i
    INNER JOIN objednavky o ON (i.objednavka_id = o.id)
    LEFT JOIN kontrolovanie k ON (i.item_id = k.id)
    WHERE o.id = '$order_id' AND o.hash = '$order_hash' AND o.dokoncena = 'A'
    je to ale spravne riesenie mojho problemu?
    6.2.2013 21:19 kuka
    Rozbalit Rozbalit vše Re: mysql join iba vtedy ak je hodnota jednej row ina ako 0
    Ne neni, nikde nevidim zadnou podminku na != 0. Ovsem nevylucuju, zes nespravne popsal svuj problem a pak by to treba spravne mohlo byt.
    7.2.2013 12:29 logik
    Rozbalit Rozbalit vše Re: mysql join iba vtedy ak je hodnota jednej row ina ako 0
    adrinko: No protože to left join se chová podobně: on evidentně nemá pro předmět 0 záznam v tabulce kontrolovanie nemá.

    kuko: Pokud pro předmět není odpovídající záznam, měl bys tam použít nikoli 0, ale NULL. Znemožňuješ tak např. použití cizích klíčů, který bys měl definovat, abys zaručil konzistenci databáze.
    7.2.2013 13:11 kuka
    Rozbalit Rozbalit vše Re: mysql join iba vtedy ak je hodnota jednej row ina ako 0
    Ja naprosto netusim, kde existuje nebo neexistuje zaznam a co ma nebo nema byt null. Jedine, co rikam, je, ze left join neni ekvivalentni s podminkou dotazeni adresy jen pro id!=0. Napriklad trivialne pokud kontrolovanie pro id=0 bude existovat, tak se adresa dotahne (nevim z ceho je "evidentni", ze takovy zaznam v tabulce nebude). Podobne ovsem bude adresa prazdna pro id=17, pokud nebude v tabulce kontrolovanie odpovidajici zaznam. Mozna ze chce tazatel ve skutecnosti prirozene vypadajici chovani "tam kde kontrolovanie existuje, pouzij z nej adresu", ale pak neni jasne, proc se na to nezepta rovnou.
    7.2.2013 14:40 logik
    Rozbalit Rozbalit vše Re: mysql join iba vtedy ak je hodnota jednej row ina ako 0
    Bez urážky, když chceš lidem radit, tak holt musíš číst i mezi řádkama....

    Málokdo umí položit otázku zcela přesně: ono to už proto, že položit správnou otázku je většinou to nejsložitější na nalezení odpovědi.
    7.2.2013 15:01 j
    Rozbalit Rozbalit vše Re: mysql join iba vtedy ak je hodnota jednej row ina ako 0
    Predevsim je treba psat dotazy, ktere delaji to co maji, a ne ze prave ted a za techto okolnosti pvraceji spravny vysledek. Left join dela uplne neco jinyho.

    zjednodusene: join ... predpoklada se vazba 1:1, pri neexistenci zaznamu v jedne z obou tabulek nevrati nic left (pripadne right) join ... prepodklada se obecna vazna 1:N (N:1), v pripade neexistence zaznamu v navazovane tabulce obecne vraci null v jejich sloupcich

    Nikde tam nevidim nic o tom, ze by nejakej sloupec mel nebo nemel mit nejakou hodnotu. Pokud tam dava left join a vraci mu to spravny vysledky, tak trebas jen proto, ze aktualne existuje pratave vazba 1:1, jenze kdyz existovat (at uz umyslne nebo chybou) prestane, tak to vrati kraviny.
    7.2.2013 16:21 logik
    Rozbalit Rozbalit vše Re: mysql join iba vtedy ak je hodnota jednej row ina ako 0
    Nelze než zopakovat radu: naučte se číst mezi řádky. Proč asi autor chtěl tam dát výsledky jen pro id<>0? Hádej. Že by proto, že 0 používá pro identifikaci: zde není předmět?? A proto ve skutečnosti jeho dotaz zněl: jak zařídím, aby ve výpisu byly i ty řádky, který nemaj odpovídající řádek v tý druhý tabulce, protože INNER JOIN mi je vyhodí? To s prominutím napadne i průměrně vyspělou opici, pokud má ta opice opravdu snahu tazateli pomoci a ne si honit ego, že tazatel je blbec a neumí SQL.

    Kardinalita pak s tím nemá vůbec co dělat, teda ne tím způsobem kterým píšeš: vazbí se na PK, takže je jasný, že je to vazba (0,N):(0,1), a problémy mu působí právě to, že to není vazba N1, ale N:(0,1). Navíc i kdyby to PK nebyl a byla to vazba M:N, tak z dotazu nijak nevyplývá, že by to bylo špatně. Chtít vypsat všechny kontroly výrobků a navíc nekontrolované výrobky dává dobrý smysl.

    To, co má v návrhu blbě a na co byste ho měli upozornit není to, že tam má left join, ten je naprosto v pořádku, ale to, že používá pro indikaci neexistence záznamu v druhé tabulce. To je jádro problému.
    7.2.2013 16:43 logik
    Rozbalit Rozbalit vše Re: mysql join iba vtedy ak je hodnota jednej row ina ako 0
    Jinak ještě: Join rozhodně NEPŘEDPOKLÁDÁ vazbu 1:1, stejně ani tak Left Join NEPŘEDPOKLÁDÁ vazbu 1:N, všechny JOINY jdou použít na jakoukoli kardinalitu.

    Protipříklad je jednoduchý: jak inner, tak outer join má smysl např. u tabulky zachycující příbuzenství. Přesto je příbuzenství obecně vazba (0,N):(0,M) a tedy nesplňuje žádný z Tvých předpisů (na obou stranách má nulu).

    INNER JOIN a (LEFT|RIGHT) OUTER JOIN se naprosto neliší tím, na jaké kardinality se aplikují, ale tím, jaké výsledky vracejí: zatímco INNER join vrací pouze subjekty s existující vazbou, OUTER join vrací seznam subjektů (nezávisle na tom, zdali mají vazbu) + informace o potenciálních vazbách.
    7.2.2013 15:37 kuka
    Rozbalit Rozbalit vše Re: mysql join iba vtedy ak je hodnota jednej row ina ako 0
    Ja prave neradim, ale pouze odpovidam na otazku. Kdybych chtel radit, tak rada by byla "nauc se SQL a nebudes muset hadat, co dela tvuj triradkovy dotaz".
    7.2.2013 16:28 logik
    Rozbalit Rozbalit vše Re: mysql join iba vtedy ak je hodnota jednej row ina ako 0
    V tom případě jdi prosím odpovídat na otázky někam jinam. Pokud jsi si nevšiml, tady není odpovídárná, tady je PORADNA a tedy zde není cílem tazateli ODPOVĚDĚT a libovat si nad tím, jak jsem chytřejší než on, ale PORADIT mu tak, aby jeho řešení problému bylo správné.

    Vzhledem k tomu, že jak píšeš, tak kdybys chtěl radit, tak budeš na tazatele taktéž sprostý a přitom Tvoje rada mu nijak nepomůže, tak jen prosím, nechoď se radši ani radit. Tedy alespoň do té doby, než se naučíš alespoň základům mezilidské slušnosti, empatie a tolerance a dokážeš přjmout to, že existují také lidé, co se teprv programovat učí.
    7.2.2013 17:37 kuka
    Rozbalit Rozbalit vše Re: mysql join iba vtedy ak je hodnota jednej row ina ako 0
    Aha takze v poradne se neodpovida na dotazy? To se dela v odpovidarne? Dekuji za toto rozsireni obzoru, ale ponecham si svuj nazor na vec. Nevim, co by melo byt "sprosteho" na tom, kdybych nekomu poradil, ze se ma neco naucit - zjistit napr. na googlu co dela left join trva asi tak stejne dlouho jako napsat dotaz zde do poradny. Nemyslim si, ze je smysluplnejsi a pro tazatele prinosnejsi, kdyz mu papouskujes svoji vlastni "definici" left joinu. Pokud jde o zakladni slusnost, nikoho odtud napriklad na rozdil od tebe nevyhazuju a nespekuluju bezduvodne o jeho charakteru, takze si prosim nalej vlastni medicinu a uz mi nic dalsiho nepis. Diky.
    8.2.2013 17:02 logik
    Rozbalit Rozbalit vše Re: mysql join iba vtedy ak je hodnota jednej row ina ako 0
    Ano, v poradně není primárním cílem zodpovědět dotaz, ale pomoci: a to znamená někdy i opravdu dotaz nezodpovědět. Nebo to chceš tvrdit, že pokud by někdo zavolal do psychiatrické poradny, jak se nabíjí pistole, tak je správné dotaz zodpovědět? Zde je situace stejná: tazatel ve skutečnosti měl jiný problém a zodpovězení otázky by mu nejen nepomohlo, ale i by ho pravděpodobně víc zmátlo a přidělalo mu práci.

    Najit na googlu co dělá left join je opravdu záležitost minuty. Ale on se NEPTAL, co dělá leftjoin. Chci todle, jak to udělám? To samostudiem googlu je práce na desítky minut a naprosto vhodné téma na otázku do poradny. A dokonce když našel správné řešení, tak ho dal do diskuse pro ostatní. Takže Tvůj argument i Tvoje kritika tazatele je jaksi dosti mimo.

    Ohledně údajné mojí definice LEFT JOINU, co z toho co jsem o něm psal konkrétně není pravda (navíc to byla jen korekce j., který opravdu o leftjoinu psal blbiny).

    A ohledně slušnosti: psal jsi, že pokud by jsi chtěl radit, tak bys mu poradil, ať se jde naučit SQL, a to poměrně dosti dehonestujícím způsobem. Pokud se Ti to zdá slušné, tak Ok, je to Tvůj názor, ale můj názor je prostě takový, že to je neomalenost. Stejnětak je IMHO dosti arogantní Tvůj postoj, že se nebudeš snažit pochopit, jak tazatel otázku myslel popř. co je jeho skutečný problém a prostě mu odpovíš, ať už mu tvoje odpověď pomůže, nebo uškodí.

    8.2.2013 09:25 j
    Rozbalit Rozbalit vše Re: mysql join iba vtedy ak je hodnota jednej row ina ako 0
    Nekam jinam (trebas doprdele) bys mel jit predevsim ty, protoze radis kraviny. Jestli totiz nekomu neco nepomuze, tak tvoje vesteni z kristalovy koule.

    Pokud se nekdo na neco zepta, tak odpovdam na to, na co se ptal a nevymejslim kraviny s tim, ze by to mohlo byt nejak, protoze tak bych to udelal ja.
    8.2.2013 17:08 logik
    Rozbalit Rozbalit vše Re: mysql join iba vtedy ak je hodnota jednej row ina ako 0
    Co jsem poradil za kravinu? Konkrétně?

    Jinak jak je vidět z reakce tazatele (napsal řešení a už se neozval, tj. řešení mu vyhovuje), tak moje "věštění" funguje. Že by to bylo tím, že to není až tak věštění, ale praxe v programování a pedagogice programování? Auto také lidem, co neznali jeho princip přišlo jako "magické čertovo vozítko"....

    8.2.2013 23:10 adrinko | skóre: 22
    Rozbalit Rozbalit vše Re: mysql join iba vtedy ak je hodnota jednej row ina ako 0
    Zdravím vás priatelia, sorry, bol som mimo pc doteraz. Vidím, že sa tu rozprúdila vcelku slušná debata. Ale naspäť k problému. Ten left join som našiel a zatiaľ mi dáva správne výsledky, ale nebude to to najlepšie riešenie, keďže tam nie je tá podmienka i.item_id!=0. Totižto, ak je i.item_id !=0, tak mi to pri joine dá do "adresa" správnu vec. Pri záznamoch, kde je i.item_id=0 nie sú v tej ľavej tabuľke left joinu záznamy, takže mi to v tom pôvodnej mysql dotaze (otvárajúca otázka tohto postu) preskočilo tento záznam (čo je pre moje potreby zle, lebo potrebujem aj tie záznamy vo výsledku). Ja by som však potreboval, aby to vracalo aj záznamy s i.item_id=0, avšak v tom prípade by mala byť "adresa" naplnená prázdnou hodnotou, t.j. adresa vo výsledkoch=''. Preto mi to zatiaľ funguje s tým left joinom, ktorý vráti i tie výsledky, kde i.item_id=0, čo je pre mňa dobre a zároveň nechá návratovú hodnotu "adresa" prázdnu. Poprosil by som však vás - skúsenejších o poradenie, aby to bol správne napísaný príkaz, t.j. aby sa v ňom dalo orientovať. Ďakujem!
    9.2.2013 14:10 Logik
    Rozbalit Rozbalit vše Re: mysql join iba vtedy ak je hodnota jednej row ina ako 0
    Jo, je to správně napsanej příkaz.

    To, co tam máš nestandardně a v podstatě se dá říci blbě je to, že nepsaným standardem je, že když někde neexistuje vazba (tzn. není tam předmět), tak se to indikuje nikoli nulou, ale hodnotou NULL. A to proto, že pak např. můžeš na item_id zadefinovat tzn. cizí klíč (foreign key) neboli referenční integritu. To bych doporučoval přepsat, ale to nemá žádnej vliv na dotaz.

    Další věc, která je tam "podezřelá" je, že se na tabulku kontrolovanie se odkazuješ pomocí sloupečku item_id. Zpravidla se na tabulku odkazuje sloupcem s jménem tabulky. Takhle to vypadá, že ten sloupeček item_id odkazuje na nějakej předmět a nikoli na kontrolu toho předmětu. Pravděpodobně máš pro každej předmět max jednu kontrolu a tak máš tabulku kontrola a předmět "sloučenou" a je to teda fakticky dobře, ale doporučoval bych změnit název sloupce item_id tak, aby odpovídal tomu, na co ukazuje, tj. kontrolovanie_id.
    9.2.2013 19:31 adrinko | skóre: 22
    Rozbalit Rozbalit vše Re: mysql join iba vtedy ak je hodnota jednej row ina ako 0
    Logik, ďakujem Ti veľmi pekne za vysvetlenie. Budem na to v budúcnosti myslieť. Ešte raz vďaka!
    7.2.2013 08:47 j
    Rozbalit Rozbalit vše Re: mysql join iba vtedy ak je hodnota jednej row ina ako 0
    JOIN kontrolovanie k ON (i.item_id = k.id) and i.item_id <> 0
    

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.