SQL:查找连接到单个 table 的记录,其中同一列具有不同的值
SQL: Find a record joined to a single table where same column has different values
我有一个名为 entities
的 table,它有许多关联的 records
,而 records
又有 names
和 values
(另外 2 个 tables).
我需要在 entities
table 中找到一条记录,该记录有两条符合以下条件的关联记录:
- 一个名称为“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 有互斥条件,结果 returns 什么都没有。所以问题是如何生成有效的 SQL 来检索所需的记录?
您的查询 returns 没有行,因为 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
我有一个名为 entities
的 table,它有许多关联的 records
,而 records
又有 names
和 values
(另外 2 个 tables).
我需要在 entities
table 中找到一条记录,该记录有两条符合以下条件的关联记录:
- 一个名称为“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 有互斥条件,结果 returns 什么都没有。所以问题是如何生成有效的 SQL 来检索所需的记录?
您的查询 returns 没有行,因为 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