【问题标题】:Need a MySQL query for selecting from a table storing key value pairs需要一个 MySQL 查询来从存储键值对的表中进行选择
【发布时间】:2010-11-26 18:45:49
【问题描述】:

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

我将使用两个表 itemsitem_properties

items

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

item_properties

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

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

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”)。

请帮助...提前致谢!

【问题讨论】:

    标签: mysql key-value key-value-store


    【解决方案1】:

    这是一个示例查询:

    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 查询,您可以自己尝试一下。它只是添加更多表并在WHERE 中使用OR 而不是AND

    【讨论】:

      【解决方案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 数据库,think 可能会更好。没什么大不了的,只是第二种形式对我来说更容易阅读。

      您的原始查询:

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

      希望有帮助!

      【讨论】:

      • 很好@extraplanetary。我已编辑我的问题以更正我的查询。
      猜你喜欢
      • 2013-04-22
      • 2018-06-06
      • 2015-02-05
      • 2012-10-15
      • 1970-01-01
      • 2020-06-09
      • 2017-01-06
      • 1970-01-01
      • 2015-04-01
      相关资源
      最近更新 更多