用 SQLite 选择满足多个条件(但不是一起)的孩子的父记录

Posted

技术标签:

【中文标题】用 SQLite 选择满足多个条件(但不是一起)的孩子的父记录【英文标题】:Selecting parent records of children that meet multiple conditions (but not together) with SQLite 【发布时间】:2021-04-13 17:07:55 【问题描述】:

我不知道为什么我可以围绕这个查询。我想我没有问正确的问题,这就是我努力寻找答案的原因。

我有两张桌子。 itemsskus。我正在尝试识别具有同时满足以下两个条件的 skus 的 items

    有一个带有price_date 的 SKU > 指定日期 有一个 SKU 的 custom = 1。

使用下面的例子:

项目

ID Name
1 My Item 1
2 My Item 2

skus

ID ItemID SKU price_date custom
1 1 1234 2020-12-11* 0
2 1 5678 2020-05-01 1*
2 2 ABDC 1900-01-01 0

我试图让我的查询从items 表中返回“我的项目 1”,因为它有一个大于我指定日期的 sku 和另一个具有等于 1 的自定义值。问题是我的如果 SKU 同时满足两个条件(意味着 1 个 sku 必须满足所有条件),则仅查询“命中”。在表格中,您可以看到 SKU ID 1 满足我的第一个条件,SKU ID 2 满足我的第二个条件,父项“我的项目 1”

即使 My Item 1 的 sku 满足条件,以下查询也不返回任何内容。

SELECT * FROM items
LEFT JOIN skus ON items.ID=skus.ItemID
GROUP BY items.ID
HAVING sku.price_date>date('2020-12-01') AND sku.custom=1

如何使查询同时查看所有子项,然后在满足所有条件时返回该项,而不管条件是否一起命中单个 sku?

【问题讨论】:

【参考方案1】:

我们需要首先确定哪些 ItemID-s 符合条件,而不是 JOIN skus。我使用 MCNT 作为表前缀 Multiple Conditions Not Together...

SELECT [ItemID]
  FROM [StackOver].[dbo].[MCNTskus]
  Group By [ItemID]
  Having 
       max([price_date]) > ('2020-12-01')
     and 
       max([custom])  = 1

然后将其用作 FROM 并进行项目的 LeftJoin

With qualSKUs as
(SELECT [ItemID]
  FROM [StackOver].[dbo].[MCNTskus]
  Group By [ItemID]
  Having 
       max([price_date]) > ('2020-12-01')
     and 
       max([custom])  = 1
)
SELECT MCNTitems.ID, MCNTitems.Name
    FROM qualSKUs
LEFT JOIN MCNTitems ON MCNTitems.ID=qualSKUs.ItemID
GROUP BY qualSKUs.ItemID,MCNTitems.ID, MCNTitems.Name

导致

ID  Name
1   My Item 1

【讨论】:

max 是答案谢谢。只需将其添加到 HAVING 比较就可以了,因为我只是在寻找符合条件的项目。谢谢。

以上是关于用 SQLite 选择满足多个条件(但不是一起)的孩子的父记录的主要内容,如果未能解决你的问题,请参考以下文章

SQLite 条件 SELECT 语句 - 多个条件但单个语句

在Mysql中如何插入一个有两个条件的值

当条件不满足时,while循环退出而不是循环

jQuery:选择 tr 的 td 满足多个条件

R - 选择满足多个条件的矩阵行的最快方法

excel函数:计算是不是满足计算值,满足直接计算,如不满足则返回一个固定值?