6

我需要在数据库(mySQL)中以键值对的形式存储一些项目及其属性。我打算按以下方式进行。

我将使用两个表itemsitem_properties.

items

项目 ID | 项目名称
------------------
 1923 | 交流电
 第1235章 冰箱
 8273 | 加热器

item_properties

项目 ID | 房产 | 价值
--------------------------------
 1923 | 效果 | 冷却
 1923 | 消费| 高效的
 1923 | 类型 | 分裂
 第1235章 效果 | 冷却
 第1235章 体积 | 20 升
 8273 | 效果 | 加热
 8273 | 消费| 高效的
 8273 | 热法 | 线圈

现在,如果我必须选择“效果”为“冷却”的项目,我可以使用以下查询来做到这一点(结果将给出“AC”和“Fridge”)。

SELECT itemName FROM items i, item_properties p
其中 i.itemId=p.itemId
AND (p.property = '效果' AND p.value ='冷却');

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

  • 选择所有“效果”为“冷却”且“消耗”为“高效”的项目(与项目“AC”匹配)。
  • 选择“type”为“split”或“heatMethod”为“coil”或“c​​onsumption”为“effecient”的所有项目(匹配项目“AC”和“Heater”)。

请帮助...提前谢谢!

4

2 回答 2

9

这是一个示例查询:

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查询保留为您可以自己尝试的内容。它只是添加更多表ORANDWHERE.

于 2010-11-26T18:53:27.043 回答
2

问候!

我认为您的原始查询可能不正确。如果您的 item_properties 表有名为 (itemId, property, value) 的列,那么您的查询应该是:

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';

选择“type”为“split”或“heatMethod”为“coil”或“c​​onsumption”为“effecient”的所有项目(匹配项目“AC”和“Heater”)。

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');

希望有帮助!

于 2010-11-26T19:06:12.253 回答