[MySQL] - Pouzitie hodnoty v dalsom Selecte
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 :)
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 :)
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.
[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.
[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..
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..
[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?
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?
[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..
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=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.
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.
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 :)
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 :)
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.
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..
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..
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.
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.