【问题标题】:Combine/Intersect results from the same SQLite table合并/交叉来自同一个 SQLite 表的结果
【发布时间】:2021-01-19 05:52:25
【问题描述】:

我有一张items 的表格,包含以下列:

ID, name

以及这些项目的properties 表格,包含这些列:

item, property, value

(其中item 是一个外键,指向items 表中的ID - 显然一个“项目”可能有从零到许多不同的属性值对)

我想要得到的是:

  • 所有项目 ID
  • 具有特定名称
  • 有一个或多个(属性-值)对。

我已经设法获得了 ONE 属性值的预期结果,如下所示:

SELECT items.id FROM items
INNER JOIN properties ON properties.item=items.id
WHERE items.name='person'
AND properties.property='someproperty' AND properties.value = 'somevalue'

这会返回我确实具有属性someproperty和值somevalue的项目的ID。

如果我想检查它是否有 ONE OF 给定的对,我会这样做:

SELECT items.id FROM items
INNER JOIN properties ON properties.item=items.id
WHERE items.name='person'
AND (
    (properties.property='someproperty' AND properties.value = 'somevalue') OR
    (properties.property='someproperty2' AND properties.value = 'somevalue2')
    ....
)

问题是我想要相同的,但是当它满足所有给定属性时(技术上不是OR,而是AND)。

我该怎么做?

有什么想法吗?

【问题讨论】:

    标签: sql database sqlite intersection


    【解决方案1】:

    使用group byhaving 如下:

    SELECT items.id FROM items
    INNER JOIN properties ON properties.item=items.id
    WHERE items.name='person'
    group by items.id  
    having count( case when
        (properties.property='someproperty' AND properties.value = 'somevalue') OR
        (properties.property='someproperty2' AND properties.value = 'somevalue2')
         then 1 end ) = 2 -- this number is property value pair from above expression
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-26
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2023-02-04
      相关资源
      最近更新 更多