reklama
Aktuality  |  Články  |  Recenze
Doporučení  |  Diskuze
Grafické karty a hry  |  Procesory
Storage a RAM
Monitory  |  Ostatní
Akumulátory, EV
Robotika, AI
Průzkum vesmíru
Digimanie  |  TV Freak  |  Svět mobilně

[MySQL] - Pouzitie hodnoty v dalsom Selecte

kikloop (140)|14.5.2008 11:09
Zdravim.. vytvaram databazu, kde v jednej tabulke pohyby evidujem pohyby jednotlivych poloziek medzi uzivatelmi.

struktury tabuliek:
[code]
pohyby
ID - id zaznamu
UID - id uzivatela
IID - id zaznamu v prislusnej tabulke podla hodnoty polozka
polozka - nazov tabulky s kompletnou evidenciou polozky danej kategorie
pridane - DATE
pridal - ID admina
aktivna - ENUM ano/nie

telefon
ID - id zaznamu
IMEI - IMEI
model - modelove oznacenie
stav - stav telefonu

simcard
ID - id zaznamu
SIMSN - SN Simkarty
telcislo - telefonne cislo
pin - PIN kod
pin2 - PIN2 kod
[/code]
a teraz ak vytiahnem nejake udaje z pohybov, potrebujem previazat tabulku pohyby s tabulkami telefon alebo simcard podla hodnoty ulozenej v stlpci polozka. Takze az polozka=telefon, tak bude hladat v tabulke telefon zaznam pohyby.IID = telefon.ID

.. no snad ste pochopili podstatu problemu a tesim sa na vase navrhy riesenia :)
Ritchie83 (369)|14.5.2008 11:40
Jedině jako dva SQL dotazy:
[CODE]SELECT * FROM `pohyby` JOIN `telefon` ON `pohyby`.`iid` = `telefon`.`id` WHERE `pohyby`.`polozka` = 'telefon'
SELECT * FROM `pohyby` JOIN `simcard` ON `pohyby`.`iid` = `simcard`.`id` WHERE `pohyby`.`polozka` = 'simcard'
[/CODE]

Pokud to povaha dotazů umožňuje, lze je spojit přímo v SQL příkazem UNION. Doufám, že sloupec položka je typu ENUM, nikoliv snad VARCHAR.
kikloop (140)|14.5.2008 12:04
[QUOTE=Ritchie83;121859]Jedině jako dva SQL dotazy:
Pokud to povaha dotazů umožňuje, lze je spojit přímo v SQL příkazem UNION. Doufám, že sloupec položka je typu ENUM, nikoliv snad VARCHAR.[/QUOTE]

jasne, je pre mna nepripustne aby tam bola ina hodnota ako nazov tabulky takze enum..

nenapada ta nejake riesenie / zrejme zmenou struktury tabuliek/ ako tie prikazy spojit? povodne som to chcel spravit tak ze pre kazdu polozku /telefon, sim/ bude existovat samostatna tabulka s pohybami, teraz som to zlucil do jednej a vytvoril stlpec s typom polozky..
Ritchie83 (369)|14.5.2008 12:37
[QUOTE=kikloop;121866]jasne, je pre mna nepripustne aby tam bola ina hodnota ako nazov tabulky takze enum..[/QUOTE]
Myslel jsem to zejména kvůli výkonu. Porovnat čísla (ENUM) je mnohem rychlejší než řetězce (VARCHAR).

[QUOTE=kikloop;121866]nenapada ta nejake riesenie / zrejme zmenou struktury tabuliek/ ako tie prikazy spojit? povodne som to chcel spravit tak ze pre kazdu polozku /telefon, sim/ bude existovat samostatna tabulka s pohybami, teraz som to zlucil do jednej a vytvoril stlpec s typom polozky..[/QUOTE]

Jiné rozumné řešení dle mého názoru neexistuje, neboť sloupce výsledků obou dotazů jsou zjevně různé. Co se vám nelíbí na dvou dotazech?
kikloop (140)|14.5.2008 13:37
[QUOTE=Ritchie83;121878]Jiné rozumné řešení dle mého názoru neexistuje, neboť sloupce výsledků obou dotazů jsou zjevně různé. Co se vám nelíbí na dvou dotazech?[/QUOTE]

hm, no povodna myslienka bola ta, ze MySQL samo doplni co bude pripajat.. Teda podla toho co je obsahom stlpca polozka, tak to pouzije v JOIN. Mozno by to slo pomocou vnorenych selectov ale to si netrufam odhadnut narocnost takych selectov na spracovanie i ked budu vsetky ID indexovane..
Ritchie83 (369)|14.5.2008 14:31
[QUOTE=kikloop;121906]hm, no povodna myslienka bola ta, ze MySQL samo doplni co bude pripajat.. Teda podla toho co je obsahom stlpca polozka, tak to pouzije v JOIN. Mozno by to slo pomocou vnorenych selectov ale to si netrufam odhadnut narocnost takych selectov na spracovanie i ked budu vsetky ID indexovane..[/QUOTE]
Pomocí vnořených výběrů by to nešlo. Všechny tabulky se spojují najednou, nelze měnit spojované tabulky podle konkrétního řádku.
[CODE]SELECT * FROM `pohyby`
LEFT JOIN `telefon` ON (`pohyby`.`iid` = `telefon`.`id` AND `pohyby`.`polozka` = 'telefon')
LEFT JOIN `simcard` ON (`pohyby`.`iid` = `simcard`.`id` AND `pohyby`.`polozka` = 'simcard')
WHERE `pohyby`.`polozka` IN ('telefon', 'simcard')[/CODE]
Výsledná tabulka bude mít tolik sloupců, kolik je součet sloupců v tabulkách pohyby + telefon + simcard a bude se hemžit hodnotami NULL. Sám si zvažte, jaké řešení je pro vás vhodnější – zda tento dotaz, nebo dvojice dotazů uvedená v předchozím příspěvku.
kikloop (140)|15.5.2008 08:29
a pomocou procedury s parametrom to menit nejde?
Viem ze sa napriklad da pomocou parametru v procedure upresnovat podmienka selectu, tak ma napdlo ci sa ten parameter neda pouzit aj ako nazov tabulky :)
Ritchie83 (369)|15.5.2008 18:14
Upřesněte mi prosím, jak si představujete, že bude vypadat tabulka s výsledkem dotazu. Které sloupce bude obsahovat? Možná při formulaci odpovědi přijdete na to, proč některé vaše návrhy nedávají smysl.
kikloop (140)|23.5.2008 14:40
uznavam, ze tie tabulky nemaju rovnaku strukturu a preto ich neni mozne spojit klasickym sposobom. A to sa prave snazim nejakym sposobom na urovni MySQL obist..
Takze po dvoch dnoch googlovania som to vzdal a spravim to klasickou cestou viacerych selectov.

Chcel som to len spravit uplne dokonale aby do buducna, az pribudne nova tabulka napriklad notebook a v pohyboch budu pre notebooky existovat zaznamy tak to MySQL vyhodi bez upravy zdrojovych kodov a selectov.. Takto budem musiet do kodu pridavat select..
Logout (4018)|23.5.2008 15:15
Slo by napsat stored procedure, ktera ty dva dotazy vykona a vrati to jako jeden dotaz, pomoci clausule UNION (ta nevim, jestli je v MySQL, znám ji z firebirdu). Oboji ale vyzaduje stejnou strukturu tech tabulek (nebo alespon vracenejch sloupcu). Dalsi moznost je ten jiz navrhovanej JOIN, ale ten je dosti neefektivni.

Pokud chces univerzalni strukturu, musis na to jit jinak. Krome tabulky pohyb mit jen jedn tabulku parametry (id autoincrement, idpolozky references polozky(id), jmeno integer references ciselnikpolozek(id), hodnotapolozky VARCHAR(...)) a do ni vždycky nasypat specialni parametry daneho pohybu. Krome toho mit statickou tabulku ciselnik polozek, ve ktery budou ulozeny nazvy sloupcu z kazde
specialni tabulky.
Prijdes tak o referencni integritu a vsechny polozky budou muset mit stejnou hodnotu, pujdou vsak vratit v jednom dotazu efektivne a bude to dosti variabilni struktura. Ale pracovat se s ni bude o dost slozitejc.
kikloop (140)|23.5.2008 16:40
tuto moznost som taktiez zvazoval ale na dany typ problemu mi to pride az prilis sofistikovane riesenie :)