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

你想要一个orand认为的地方:

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

首先,我建议您使用不同的数据库结构:

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 回答