我有一个包含产品规格的表。我在http://sqlfiddle.com/#!2/15575/1中创建了一个数据样本。我想创建用户可以按规格搜索产品的搜索表单。例如用户搜索 RAM=2 和 VGA=512 或 VGA=1 的笔记本电脑。我写了一个查询,但没有工作。请帮助我。这个例子:结果:1525,1535,k5,k6
问问题
379 次
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
例子:
于 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
首先,我建议您使用不同的数据库结构:
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 回答