Zadejte hledaný výraz...
Jakub Glos
Webtrh.cz
Vývoj webových stránek na WordPressu a proklientský přístup pro freelancery
Třídenní infromacemi nabitý prezenční + online kurz v Praze od Webtrhu pouze za 2 871 Kč
Více informací

Pomoc s MySQL dotazem

Petr Daněk
verified
rating uzivatele
(33 hodnocení)
24. 9. 2010 14:30:52
Ahoj, mam problem s jednim sql dotazem. Mam takovou tabulku:
CREATE TABLE `product_parameter` (
`product_patameter_id` int(11) NOT NULL AUTO_INCREMENT,
`product_id` int(11) NOT NULL,
`parameter_option_id` int(11) NOT NULL
V ni treba takove data:
INSERT INTO `product_parameter` (`product_patameter_id`, `product_id`, `parameter_option_id`) VALUES
(20, 100, 19),
(18, 102, 20),
(19, 100, 16),
(22, 100, 17),
(17, 102, 13);
Potrebuju vytahnout id produktu, ktery ma parameter_option_id = 16 a zaroven parameter_option_id = 19 (v uvedenem pripade aby mi to vytahlo product_id 100). parameter_option_id muze byt 0 - nekonecno.
Diky za nakopnuti.
24. 9. 2010 14:30:52
https://webtrh.cz/diskuse/pomoc-s-mysql-dotazem/#reply562143
Martin Klíma
verified
rating uzivatele
(13 hodnocení)
24. 9. 2010 14:35:24
asi to čtu špatně ale nechápu to.
ty chceš aby "parameter_option_id" byl 16 a zároven aby stejný "parameter_option_id" byl 19 a "parameter_option_id" může být 0 až nekonečno???
24. 9. 2010 14:35:24
https://webtrh.cz/diskuse/pomoc-s-mysql-dotazem/#reply562142
Taps
verified
rating uzivatele
(118 hodnocení)
24. 9. 2010 14:36:03
zkus toto
select product_id from product_parameter where parameter_option_id in (16,19)
nebo
select product_id from product_parameter where parameter_option_id='16' or parameter_option_id='19'
24. 9. 2010 14:36:03
https://webtrh.cz/diskuse/pomoc-s-mysql-dotazem/#reply562141
Petr Daněk
verified
rating uzivatele
(33 hodnocení)
24. 9. 2010 14:37:56
Napsal Pooky;574703
asi to čtu špatně ale nechápu to.
ty chceš aby "parameter_option_id" byl 16 a zároven aby stejný "parameter_option_id" byl 19 a "parameter_option_id" může být 0 až nekonečno???
Tech parameter_option_id muze byt v te tabulce ke kazdemu produktu 0 - moc...
Ja vim, ze zakaznik vybral, ze chce vytahnout produkty, ktere maji parameter_option_id = 16 a parameter_option_id = 19, tak je potrebuju vybrat.
Snad si rozumime.
---------- Příspěvek doplněn 24.09.2010 v 14:39 ----------
Napsal Taps;574704
zkus toto
select product_id from product_parameter where parameter_option_id in (16,19)
nebo
select product_id from product_parameter where parameter_option_id='16' or parameter_option_id='19'
To nebude fungovat - to mi vybere i kdyz bude splnena jen jedna podminka, potrebuju aby vybral jen ty produkty, ktere maji parameter_option_id = 16 a zaroven parameter_option_id = 19 (takze ne OR)
24. 9. 2010 14:37:56
https://webtrh.cz/diskuse/pomoc-s-mysql-dotazem/#reply562140
Martin Klíma
verified
rating uzivatele
(13 hodnocení)
24. 9. 2010 14:40:55
K tomu ale potřebuješ minimálně jednu tabulku, protože tady nikdy nebudeš mít "parameter_option_id" = 16 a zárověn "parameter_option_id" = 19
24. 9. 2010 14:40:55
https://webtrh.cz/diskuse/pomoc-s-mysql-dotazem/#reply562139
Petr Daněk
verified
rating uzivatele
(33 hodnocení)
24. 9. 2010 14:42:58
No napadlo me jedno reseni a to sice:
SELECT product_id, COUNT(*)
FROM product_parameter
WHERE ( parameter_option_id = 19 OR parameter_option_id = 16 )
GROUP BY product_id HAVING 2
S tim, ze misto toho HAVING 2 musim vzdy doplnit prislusny pocet parametru, ktere pozaduju...Ale zajima me, zda to jde nejak jinak.
24. 9. 2010 14:42:58
https://webtrh.cz/diskuse/pomoc-s-mysql-dotazem/#reply562138
Martin Klíma
verified
rating uzivatele
(13 hodnocení)
24. 9. 2010 14:47:50
Napsal kenod;574709
No napadlo me jedno reseni a to sice:
SELECT product_id, COUNT(*)
FROM product_parameter
WHERE ( parameter_option_id = 19 OR parameter_option_id = 16 )
GROUP BY product_id HAVING 2
S tim, ze misto toho HAVING 2 musim vzdy doplnit prislusny pocet parametru, ktere pozaduju...Ale zajima me, zda to jde nejak jinak.
Pořád tomu nerozumím, to co tu píšeš není technicky možné. Nemůžeš udělat SQL dotaz na tabulku typu "SELECT * FROM table WHERE sloupec = 5 AND sloupec = 6"; to technicky není možné. Ten sloupec bude mít buď hodnotu 5 a nebo 6 ale nikdy je nebude mít obě zároveň.
24. 9. 2010 14:47:50
https://webtrh.cz/diskuse/pomoc-s-mysql-dotazem/#reply562137
Petr Daněk
verified
rating uzivatele
(33 hodnocení)
24. 9. 2010 14:51:57
Napsal Pooky;574713
Pořád tomu nerozumím, to co tu píšeš není technicky možné. Nemůžeš udělat SQL dotaz na tabulku typu "SELECT * FROM table WHERE sloupec = 5 AND sloupec = 6"; to technicky není možné. Ten sloupec bude mít buď hodnotu 5 a nebo 6 ale nikdy je nebude mít obě zároveň.
Jasne ze nebude mit na jednom radku stejnou hodnotu, ale ten produkt tam muze mit vice zaznamu s parametry. Ano, pres AND spojeni to nepujde, proto se ptam na jine reseni, jestli se s tim nekdo setkal.
24. 9. 2010 14:51:57
https://webtrh.cz/diskuse/pomoc-s-mysql-dotazem/#reply562136
naniccz
verified
rating uzivatele
(3 hodnocení)
24. 9. 2010 14:52:56
Řešením je
SELECT `product_id` FROM `product_parameter` WHERE `parameter_option_id` IN (16,19) GROUP BY `product_id` HAVING count(*)=2
ale problém je imho v neštěstném návrhu databáze pro tenhle účel
24. 9. 2010 14:52:56
https://webtrh.cz/diskuse/pomoc-s-mysql-dotazem/#reply562135
Martin Klíma
verified
rating uzivatele
(13 hodnocení)
24. 9. 2010 14:53:36
Napsal kenod;574717
Jasne ze nebude mit na jednom radku stejnou hodnotu, ale ten produkt tam muze mit vice zaznamu s parametry. Ano, pres AND spojeni to nepujde, proto se ptam na jine reseni, jestli se s tim nekdo setkal.
To nebude fungovat - to mi vybere i kdyz bude splnena jen jedna podminka, potrebuju aby vybral jen ty produkty, ktere maji parameter_option_id = 16 a zaroven parameter_option_id = 19 (takze ne OR)
Několikrát tu píšeš "a zároveň" tak jak z toho mám poznat co vlastně myslíš?
24. 9. 2010 14:53:36
https://webtrh.cz/diskuse/pomoc-s-mysql-dotazem/#reply562134
Petr Daněk
verified
rating uzivatele
(33 hodnocení)
24. 9. 2010 15:00:01
Napsal naniccz;574718
Řešením je
SELECT `product_id` FROM `product_parameter` WHERE `parameter_option_id` IN (16,19) GROUP BY `product_id` HAVING count(*)=2
ale problém je imho v neštěstném návrhu databáze pro tenhle účel
Diky.
Jake by bylo idealnejsi reseni DB?
mam tabulky: product
parameters (parameter_id, name, sort)
parameter_options(parameter_option_id, parameter_id, value, sort)
product_parameter(product_parameter_id, product_id, parameter_id, parameter_option_id)
Jde o to, ze parametry i jejich volby si lze pridavat v administraci a jednotlive produkty muzou mit ruzny pocet techto parametru. Nenapada me jak to zjednodusit.
24. 9. 2010 15:00:01
https://webtrh.cz/diskuse/pomoc-s-mysql-dotazem/#reply562133
Napsal Pooky;574713
Pořád tomu nerozumím, to co tu píšeš není technicky možné. Nemůžeš udělat SQL dotaz na tabulku typu "SELECT * FROM table WHERE sloupec = 5 AND sloupec = 6"; to technicky není možné. Ten sloupec bude mít buď hodnotu 5 a nebo 6 ale nikdy je nebude mít obě zároveň.
Patrně chce najít produkt, který má v product_parameter dva záznamy jeden s parameter_option_id = 16 a druhý = 19.
Ten select je celkem OK, jen bych ho trochu upravil:
SELECT product_id, COUNT(DISTINCT parameter_option_id) cnt
FROM product_parameter
WHERE ( parameter_option_id = 19 OR parameter_option_id = 16 )
GROUP BY product_id
HAVING cnt = 2
Tvoje varianta by nefungovala v případě, že bys tam měl pro jeden produkt dva parametry se stejným parameter_option_id (nevím jestli je v systému možné), definice tabulky to umožňuje.
Jirka Matějka
24. 9. 2010 15:00:14
https://webtrh.cz/diskuse/pomoc-s-mysql-dotazem/#reply562132
qwertr
verified
rating uzivatele
(7 hodnocení)
24. 9. 2010 15:34:43
Pokial som to spravne pochopil. Maz tabulku zo zoznamom produktov. Dalej je tabulka so zoznamom parametrov. A teraz chces povedat, ze dany produkt obsahuje tieto paremetre. Zatial to chapem. A potom ku kazdaj kombinacii produkt parameter moze byt niekolko 0 - az n volieb ? . Ak by to malo byt nieco take, tak by som ja navrhol nieco take tabulka produkt(id_produkt), parameter(id_parameter), vezba_produkt_parameter(id_vazba, id_produkt, id_parameter) takze teraz je povedane ake parametre sa viazu ku produktom.
24. 9. 2010 15:34:43
https://webtrh.cz/diskuse/pomoc-s-mysql-dotazem/#reply562131
Petr Daněk
verified
rating uzivatele
(33 hodnocení)
24. 9. 2010 15:37:49
Napsal qwertr;574747
Pokial som to spravne pochopil. Maz tabulku zo zoznamom produktov. Dalej je tabulka so zoznamom parametrov. A teraz chces povedat, ze dany produkt obsahuje tieto paremetre. Zatial to chapem. A potom ku kazdaj kombinacii produkt parameter moze byt niekolko 0 - az n volieb ? . Ak by to malo byt nieco take, tak by som ja navrhol nieco take tabulka produkt(id_produkt), parameter(id_parameter), vezba_produkt_parameter(id_vazba, id_produkt, id_parameter) takze teraz je povedane ake parametre sa viazu ku produktom.
Ano, presne takovy navrh co jsi tady napsal mam taky. akorat tvoje tabulka vezba_produkt_parameter se u me jmenuje product_parameter
24. 9. 2010 15:37:49
https://webtrh.cz/diskuse/pomoc-s-mysql-dotazem/#reply562130
qwertr
verified
rating uzivatele
(7 hodnocení)
24. 9. 2010 18:31:51
Podla mna je to dobre navrhnute. Klasicka vezba M:N pomocou vezobnej tabulky.
Napadlo ma dalsie riesenie toho tahania
select * from product_parameter where parameter_optional_id = 19 and product_id in (select product_id from product_parameter where parameter_optional_id = 17)
V tom pripade vytiahnem najskor zaznamy ktore mi splnaju prvu podmienku a potom mam dalsi podmienku, ze product id sa musi nachadzat v zozname product_id ktore splnaju druhu podmienku. Pocet tych dalsich podmienok moze byt n
alebo druha warianta
select * from product_parameter a where parameter_optional_id = 19 and exists (select product_id from product_parameter b where b.parameter_optional_id = 17 and a.product_id = b.product_id)
Tu neprehladavam cely zoznam zaznamov ktore splnaju druhu podmienku, ale mu rovno poviem ze pre id_pproduktu z prevej podmienky musi existovat zaznam ktory splna to, ze ma id_produktu z prvej podmienky a sucasne splna druhu podmienku
24. 9. 2010 18:31:51
https://webtrh.cz/diskuse/pomoc-s-mysql-dotazem/#reply562129
Pro odpověď se přihlašte.
Přihlásit