1

製品の仕様を含むテーブルがあります。http://sqlfiddle.com/#!2/15575/1にデータのサンプルを作成しましたユーザーが仕様で製品を検索できる検索フォームを作成します。たとえば、ユーザーは、RAM=2およびVGA=512またはVGA=1のラップトップを検索します。クエリを作成しましたが、機能しません。助けてください。この例:結果:1525,1535、k5、k6 ここに画像の説明を入力してください

4

4 に答える 4

5
select product 
from my_table  
where (custom = 'Ram' and custom_value = '2') 
    or (custom = 'vga' and custom_value in ('1', '512'))
group by product
having count(distinct custom) = 2

例:

http://sqlfiddle.com/#!2/15575/19

于 2012-04-19T15:40:07.987 に答える
1

私はあなたの要求を次のように解釈しています:-あなたの各基準の中で、あなたはOR条項が必要です。-すべての基準がAND一緒に編集されます。

したがって、上記のサンプルでは、​​次のようにします。

SELECT products.product FROM 
(select distinct product from my_table) as products
where 
   exists (
      select * from my_table where products.product = my_table.product
      and custom='Ram' and custom_value='2')
and exists (
      select * from my_table where products.product = my_table.product
      and custom='vga' and custom_value in('512','1'))

ここで、製品の一意のリストから始めて、各基準をチェックして、その製品に値が存在するかどうかを確認します。

SQLフィドルはこちら: http ://sqlfiddle.com/#!2/15575/35

そうは言っても、テーブルを再設計する必要があります。

このクエリから、再設計の開始点が何であるかを確認できます。まず、ユニークな製品だけをリストしたテーブルを作成します。次に、基準ごとにテーブルを作成します。または、固有の製品のテーブルを展開して、それらのカスタム値('Ram'、'vga'など)のそれぞれを固有の製品のテーブルの列として使用します。

于 2012-04-19T15:48:14.363 に答える
0

あなたorは私が思うところにあなたが欲しいですand

SELECT product, count(*) as prod_count FROM my_table  
WHERE (custom='Ram' and custom_value='2') 
or (custom='vga' and custom_value in('512','1'))
group by product
having prod_count = 2
于 2012-04-19T15:35:18.860 に答える
0

まず、別のDB構造を使用することをお勧めします。

CREATE TABLE COMPANY (ID INT, NAME VARCHAR(50), PRIMARY KEY(ID));
CREATE TABLE RAM (ID INT, NAME VARCHAR(50), PRIMARY KEY(ID));
CREATE TABLE CPU (ID INT, NAME VARCHAR(50), PRIMARY KEY(ID));
CREATE TABLE VGA (ID INT, NAME VARCHAR(50), PRIMARY KEY(ID));

次に、リレーショナルテーブルを使用して、製品のプロパティを指定します。

CREATE TABLE PRODUCT_PROPERTIES (
    ID_PRODUCT INT REFERENCES PRODUCT(ID), 
    ID_COMPANY INT REFERENCES COMPANY (ID),     
    ID_RAM INT REFERENCES RAM (ID),    
    ID_CPU INT REFERENCES CPU (ID),    
    ID_VGA INT REFERENCES VGA (ID),
    PRIMARY KEY(ID_PRODUCT)
);

次に、単純なJOINSと単純なSELECTを使用してPRODUCT_PROPERTIES、結果を簡単にフィルタリングできます。

お役に立てれば..

于 2012-04-19T15:42:26.053 に答える