【问题标题】:Rails - Get records from table by field valuesRails - 按字段值从表中获取记录
【发布时间】:2013-12-10 11:51:17
【问题描述】:

我有存储 item_id、property_id 和 value_id(属性值,有关项目)的表。它看起来像这样:

item_id   property_id   value_id
--------------------------------
001       p_001         aaa      
001       p_002         bbb      
001       p_003         ccc      
002       p_001         zzz      
002       p_002         bbb      
002       p_003         ddd      
003       p_001         yyy      
003       p_002         bbb      
003       p_003         ddd      

所以我想要获取具有值val = [bbb] 的项目,例如,它将是 item_001、item_002 和 item_003。
但是现在我想要具有 val = [bbb, ccc] 值的项目,它只会是 item_001。
现在我想获取具有val = [bbb, ddd] 值的项目,显然是 item_002 和 item_003。
val = [aaa,zzz] 应该输出item_001 和item_002。

我怎样才能做到这一点?
我以为有简单的SQL查询,但我无法正确构造它。

【问题讨论】:

  • 你有机会使用 postgresql 吗?因为那样你就可以使用 array_agg 聚合器
  • 好吧,如果解决方案独立于平台会更好,因为项目尚未部署。

标签: sql ruby-on-rails


【解决方案1】:

在rails mysql中你可以这样做:

Item.find(:all, :select => :item_id,:group => 'item_id HAVING COUNT(id) >= 2', :conditions => ['value_id IN (?)', ['bbb','ccc']]) 

您将看到 SQL 查询:

Item Load (0.2ms)  SELECT item_id FROM `items` WHERE (value_id IN ('bbb','ccc')) GROUP BY item_id HAVING COUNT(id) >= 2

【讨论】:

  • 我想到了类似的东西,但是如果我输入val = [aaa, zzz]呢?我什么也得不到,因为 item 不会有 2 个相同属性的值。
  • 更新前您的回答不清楚。当您说:val = [bbb, ccc], it will be item_001 only. 时,看起来 val = [aaa, zzz] 应该什么都不是。那么这里的逻辑是什么?难道你不打算只从列表中获取具有所有 value_id 的 item_id 吗?
  • 好吧,实际上我想像Amazon 那样进行内容过滤,但我有这样的表格方案。有可能吗?
  • 不够清楚为什么val = [aaa,zzz] 应该输出item_001item_002,而val = [bbb, ccc] 只给出item_001,而不是002003。似乎您想要:1. 如果 item_id 具有列表中的所有 value_id,则只返回它,而不是只有一个 value_id 的 item_id。 2. 如果没有这样的项目,则还返回只有一个值的 item_ids。如果我错了,请告诉我。
  • 这很难解释,所以我举个简单的例子:假设我想买药——我想要一瓶 50 毫升的药水。因此,液体或标签将是 p_001,而 50 或 100 将是 p_002。因此,如果我检查“液体”和“50 毫升”,我只想要 50 毫升瓶装的液体,但如果我想要 50 或 100 瓶怎么办?所以这里应该弹出瓶子,那是 100 毫升,就这样。对不起,如果我的英语太糟糕了。
【解决方案2】:

虽然我没有时间模拟整个场景进行测试,但我认为以下方法应该可行:

SELECT DISTINCT A.item_id 
FROM   table A 
       INNER JOIN table B 
               ON A.item_id = B.item_id 
       INNER JOIN table C 
               ON A.item_id = C.item_id 
WHERE  A.value_id = 'bbb' 
       AND B.value_id = 'ccc' 

此外,以下链接应该会有所帮助:
SQL: how to select a single id ("row") that meets multiple criteria from a single column

祝你好运,

【讨论】:

  • 是否可以将表连接到自身?还是我应该创建临时表?
  • 是的,您可以将表连接到自身。 (因此您不需要临时表)以下链接提供了一些附加信息:stackoverflow.com/questions/9824948/…
  • 我需要INNER JOIN 与我拥有的不同属性一样多的表吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 2018-02-22
相关资源
最近更新 更多