2010-11-26 69 views
4

我需要在数据库(mySQL)中以键值对的形式存储少量项目及其属性。我打算如下进行。需要一个MySQL查询从存储键值对的表中进行选择

我将使用两个表itemsitem_properties

items

 
itemId | itemName 
------------------- 
1923 | AC 
1235 | Fridge 
8273 | Heater 

item_properties

 
itemId | property | value 
-------------------------------- 
1923 | effect  | cooling 
1923 | consumption | efficient 
1923 | type  | split 
1235 | effect  | cooling 
1235 | volume  | 20 liters 
8273 | effect  | heating 
8273 | consumption | efficient 
8273 | heatMethod | coil 

现在,如果我有选择项,它们的 '效果' 是 '冷却',我能做到这一点使用下面的查询(这会给我' AC'和'Fridge')。

 
SELECT itemName FROM items i, item_properties p 
WHERE i.itemId=p.itemId 
AND (p.property = 'effect' AND p.value ='cooling'); 

我想知道如何编写查询来选择匹配多个属性,如

  • 的项目选择其“效果”是“冷”与“消费”的所有项目是“有效的”(这会匹配项目'AC')。
  • 选择'type'为'split'或'heatMethod'为'coil'或OR'consumption'为'effecient'(可匹配项目“AC”和“Heater”)的所有项目。

请帮助...提前致谢!

回答

7

下面是一个例子查询:

SELECT 
    itemName 
FROM 
    items i, 
JOIN 
    item_properties effect 
    ON i.itemId = effect.itemId AND effect.property = 'effect' 
JOIN 
    item_properties consumption 
    ON i.itemId = consumption.itemId AND consumption.property = 'consumption' 

WHERE effect.value = 'cooling' AND consumption.value = 'efficient'; 

我将离开oR查询的东西,你可以尝试自己。这只是增加更多的表,并使用OR而不是在WHERE

+0

谢谢@WoLpH! :)爽脆简单... – Goje87 2010-11-27 10:35:29

2

问候!

我想你的原始查询也许是不对的..如果你item_properties表中有一个名为列(的itemId,财产值),那么您的查询应该是:

SELECT i.itemName FROM items i, item_properties p 
WHERE i.itemId=p.itemId AND p.property='cooling'; 

而且,你在做“隐加入“,而且我不知道你想学习多少SQL,而只是想让某些东西起作用,但还有另一种编写查询的方式,我认为如果你打算坚持,可能会更好与SQL数据库一段时间。这没什么大不了的,只是第二种形式更容易阅读。

原始查询:

SELECT itemName FROM items i, item_properties p 
WHERE i.itemId=p.itemId AND p.property='cooling'; 

会使用连接语法被改写:

SELECT i.itemName FROM items i 
JOIN item_properties p ON i.itemId=p.itemId WHERE p.property='cooling'; 

我会尽量回答你的问题,给这两种形式...

选择“效应”为“冷却”且“消耗”为“有效”(其将与“AC”匹配)的所有项目。

select itemName FROM items i, item_properties p 
WHERE i.itemId=p.itemId AND (p.property='cooling' AND p.value='consumption'); 

select i.itemName FROM items i JOIN item_properties p ON i.itemId=p.itemId 
WHERE p.property='cooling' AND p.value='consumption'; 

选择其“类型”是“分裂” OR“heatMethod”为“线圈” OR“消费”是“effecient”(这将匹配项的AC“和“加热器”)的所有项目。

select itemName FROM items i, item_properties p 
WHERE i.itemId=p.itemId AND ((p.property='type' AND p.value='split') OR 
(p.property='heatMethod' AND p.value='coil') OR 
(p.property='consumption' AND p.value='efficient')); 

select itemName FROM items i JOIN item_properties p ON i.itemId=p.itemId 
WHERE (p.property='type' AND p.value='split') OR 
(p.property='heatMethod' AND p.value='coil') OR 
(p.property='consumption' AND p.value='efficient'); 

希望帮助!

+0

好抓@extraplanetary。我编辑了我的问题来纠正我的查询。 – Goje87 2010-11-27 10:37:01

相关问题