【问题标题】:SQL: Find a record joined to a single table where same column has different valuesSQL:查找连接到单个表的记录,其中同一列具有不同的值
【发布时间】:2021-03-14 16:27:09
【问题描述】:

我有一个名为entities 的表,它有许多关联的records,而namesvalues(还有2 个表)。

我需要在entities 表中找到一条记录,该记录有两条关联记录,条件如下:

  • 名称为“Name 1”且值为“Value 1”的一个
  • 第二个名称为“Name 2”,值为“Value 2”

现在我有这样无效的 SQL:

SELECT entities.id
FROM   `entities`
       INNER JOIN `records`
               ON `records`.`entity_id` = `entities`.`id`
       INNER JOIN `names`
               ON `names`.`id` = `records`.`name_id`
       INNER JOIN `values`
               ON `values`.`record_id` =`records`.`id`
WHERE  
           `names`.`name` = 'Name 1'
       AND `names`.`resource_type` = 'Type'
       AND ( values.value LIKE '%Value 1%' )
       AND `names`.`name` = 'Name 2'
       AND `names`.`resource_type` = 'Type'
       AND ( values.value LIKE '%Value 2%' )  

此 SQL 具有互斥条件,因此它不返回任何内容。那么问题是如何生成有效的 SQL 来检索所需的记录?

【问题讨论】:

  • 您在 name.name 上有两个条件,按照它们的配置方式,它们将始终生成零行结果集。您是否打算通过某些连接从名称中获取两个名称?如果是这样,您将需要以不同的条件对表进行第二次联接才能获得第二个名称。
  • 我的查询只是一个想法,是的,它不起作用。我需要找到具有关联名称 = 名称 1 和 values.value = 值 1 的记录的实体以及具有关联名称 = 名称 2 和 values.value = 值 2 的记录。

标签: mysql sql inner-join where-clause having-clause


【解决方案1】:

您的查询没有返回任何行,因为您在 WHERE 子句中有冲突的条件。如果我正确地遵循了这一点,您可以使用 HAVING 子句进行聚合和过滤。

SELECT e.id
FROM entities e
INNER JOIN records r ON r.entity_id = e.id
INNER JOIN names n   ON n.id = r.name_id
INNER JOIN values v  ON v.record_id =r.id
WHERE n.resource_type = 'Type'
GROUP BY e.id
HAVING MAX(n.name = 'Name 1' AND v.value LIKE '%Value 1%') = 1
   AND MAX(n.name = 'Name 2' AND v.value LIKE '%Value 2%') = 1

【讨论】:

  • 这正是我需要的@GMB!非常感谢,它有效
  • 唯一的问题是为什么我们使用带有布尔结果(条件)的MAX? @GMB
猜你喜欢
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
相关资源
最近更新 更多