1 (edited by napalias 2011-10-24 01:26:30)

Topic: SQL uzklausa, istraukti unikalius kintamuosiuos

Sveiki,

turiu tokią duomenų strukturą
http://www.napalias.com/isrinkimas.png

Man niekaip nepavyksta sugalvoti užklausos, kad ištraukti "id_product", pagal tokią sąlygą:

id_feature value=56 ir 32 tada turėtu ištraukti id_product = 13

jeigu id_feature_value lygu tik 32, tada turėtų ištraukti id_product 13, 12, 10

(Id_feature nereikalingas)

Re: SQL uzklausa, istraukti unikalius kintamuosiuos

napalias wrote:

tokią sąlygą:
id_feature value=56 ir 32 tada turėtu ištraukti id_product = 13

kaip gali vienas fieldas turėti iškart dvi reikšmes?

No warning? No action? I hate this situation!

Re: SQL uzklausa, istraukti unikalius kintamuosiuos

kur id_feature lygu 56 arba 32 ir id_product lygu 13

SELECT * FROM `table_name` WHERE `id_feature` IN (56, 32) AND `id_product` = 13

kur id_feature lygu 56 ar 32 arba id_product lygu 13

SELECT * FROM `table_name` WHERE `id_feature` IN (56, 32) OR `id_product` = 13

P.S. "...id_feature value=56 ir 32 tada turėtu ištraukti id_product = 13..." nelabai supratau ka turejai omenyje sakydamas "tada turėtu ištraukti"

Re: SQL uzklausa, istraukti unikalius kintamuosiuos

Manau jam reikia gauti produkto ID, kuris turi reikiamas savybes

Kažkas panašaus į

SELECT GROUP(id_product) as product_id, COUNT (id) as cnt FROM `table_name` WHERE `id_feature` IN (56, 32) HAVING cnt = 2

?

Re: SQL uzklausa, istraukti unikalius kintamuosiuos

Esme tokia:

Yra filtravimo forma:

Parametras-1:
(Pasirinkti is saraso)
Parametras-2:
(Pasirinkti is saraso)
Parametras-3
(Pasirinkti is saraso)

kiekvieno select value yra "id_feature_value"

Gal tada geriau  daryti 3 mysql uzklausas ir su kiekviena uzklausa istraukti unikalias "id_product" reiksmias  ir sulyginti gautus rezultatus.

(žinau, paprasciau kad lenteles struktura butu id_product | id_feature_value_1 | id_feature_value_2, id_feature_value_3, bet yra kaip yra)

Re: SQL uzklausa, istraukti unikalius kintamuosiuos

Jei reikia visu prekiu kurios turi bent viena is savybiu:

SELECT DISTINCT `id_product` FROM `table_name` WHERE `id_feature` IN (56, 32)

Jei reikia visu prekiu kurios turi nurodytas savybes:

SELECT `id_product` FROM `table_name` WHERE `id_feature` = 56 AND `id_feature` = 32

Re: SQL uzklausa, istraukti unikalius kintamuosiuos

Pirmas man netinka, nes man reikia kad atitiktu visus pasirinktu kriterijus.

Antras netinka nes kiekviena id_product ir id_featured_value sajunga yra atskiroj eilutej

Re: SQL uzklausa, istraukti unikalius kintamuosiuos

o tai tada sitas ko netinka?

SELECT GROUP(id_product) as product_id, COUNT (id_product) as cnt FROM `table_name` WHERE `id_feature` IN (56, 32) HAVING cnt = 2

Re: SQL uzklausa, istraukti unikalius kintamuosiuos

Nors apskritai dauguma paieškų normalizuotose lentelėse yra daromos su JOIN pagalba. Mano siūlytas atvejis tinka nebent jei tau tereikia tik gauti ID, bet jei nori ir paties produkto aprašymo kažkas panašaus į turėtų būti naudojamas

SELECT [laukai kurių reikia] FORM `prouducts` as product
LEFT JOIN  properties as kaina ON prouduct.id = kaina.id_product
LEFT JOIN  properties as dydis ON prouduct.id = dydis.id_product
WHERE (kaina.id_feature_value = BETWEEN 10 AND 50) AND dydis.id_feature_value = 'D'

Re: SQL uzklausa, istraukti unikalius kintamuosiuos

SELECT GROUP(id_product) as product_id, COUNT (id_product) as cnt FROM `table_name` WHERE `id_feature` IN (56, 32) HAVING cnt = 2

Sitas neveikia, vienodus grupouoja distinct bet kai padarai skaiciuoti count suskaiciuoja visus irasu atitinkacius salyga

SELECT [laukai kurių reikia] FORM `prouducts` as product
LEFT JOIN  properties as kaina ON prouduct.id = kaina.id_product
LEFT JOIN  properties as dydis ON prouduct.id = dydis.id_product
WHERE (kaina.id_feature_value = BETWEEN 10 AND 50) AND dydis.id_feature_value = 'D'

Sitas sujungia kelias lenteles o man reikia istraukti tik is vienos

Re: SQL uzklausa, istraukti unikalius kintamuosiuos

Kaltas, turetu buti:

SELECT GROUP(`id_product`) as `product_id`, COUNT (`id_product`) as `cnt` FROM `table_name` WHERE `id_feature` IN (56, 32) HAVING `cnt` = 2 GROUP BY `id_product`

Siaip mes tau duodam tik idejes, o jas prisitaikyti turetum jau pats. Ar tu nori visko gatavo ant sidabrines lekstutes?

Re: SQL uzklausa, istraukti unikalius kintamuosiuos

Aplamai neveikia uzklausa su GROUP, kad ir palikus

SELECT GROUP(id_product) as product_id FROM lentele

Re: SQL uzklausa, istraukti unikalius kintamuosiuos

Dekui visiems,

Mano norima uzklausa turejo atrodyti taip :)

SELECT  id_product  FROM lentele WHERE id_feature_value IN (56, 32) GROUP BY id_product HAVING count(id_product) = 2