Autor Zpráva
Kcko
Profil
<offtopic>
Me by zajimalo jak resit toto



produkty_kategorie
================
id_produktu | id_kategorie
1 | 2
1 | 70
2 | 2
3 | 70
4 | 2
4 | 70

vybrat vsechy produkty z teto tabulky ktere se vyskytuji v kategoriich 2 a 70 ( v obou soucasne )

</offtopic>

Cili vysledkem selectu musi byt tyto hodnoty 1 a 4 :)


Prisel sem na toto:


SELECT id_produktu, COUNT(id_produktu) pocet
FROM produkty_kategorie
WHERE id_kategorie IN (2, 70)
GROUP BY id_produktu
HAVING pocet = 2



Nelze to nejak fikaneji?
LVD
Profil *
Nelze.
MzM
Profil
jednak je to blbě a jednak mě neustále udivuje, jak někdo může napsat, že to nejde lépe i když to lépe jde. (ááá to jsem zase krásně hnusný)...
Předkládaný select vybere všechny výrobky kteréjsou v jedné NEBO druhé kategorii, tzn. nevyhovuje zadání.
Takže jsme s Kckem došli na to, že rozumné (nikoli nejleší pro všechny případy) bude pro každý produkt ve where ověřit jestli existuje v dané kategorii. Něco jako

select *
from produkt
where exists(select product_id from produkty_kategorie where id_kategorie = 2)
and exists(select product_id from produkty_kategorie where id_kategorie = 70)

Někdo by mohl namítnout, že by bylo lepší spíš tvořit join-y. Ale pokud se bude kategorie dynamicky měnit (3 kategorie, 6 - kategoriií, ...), tak se to bude jednak hůř generovat (to je samozřejmně chabý argument), ale podle mě se bude pomalejii selectovat. Pro exists se vyhodnotí první, co nevyhovuje a na zbytek se nesáhne (zkrácené vyhodnocování podmínek).

(jsem se zase vykecal.. :-) )

.... a největš průůů....er je, když tohle je taky blbě... v těch vnořených selectech musí být ještě podmínka na ten konkrétní výrobek.
Kajman_
Profil *
MzM
které jsou v jedné NEBO druhé kategorii

To by tam nesmělo být to having (ale je nutné, aby ty dva sloupečky měly jedinečný klíč nebo dát do count distinct id_kategorie).
MzM
Profil
jj, taky na to koukám, holt nejsem neomylný.. :-)
Kcko
Profil
MzM Exists mi nefunguje, vybira vsechno

Kajman_neco rychlejsiho , smysluplnejsiho?
Kajman_
Profil *
když tohle je taky blbě

ale jenom o kousek

select *
from produkt
where produkt_id in (select product_id from produkty_kategorie where id_kategorie = 2)
and produkt_id in (select product_id from produkty_kategorie where id_kategorie = 70)

Těžko říct, co bude rychlejší.
Kcko
Profil
Je to o neco pomalejsi nez ten muj prvni dotaz

diky zamykam vlakno
Toto téma je uzamčeno. Odpověď nelze zaslat.