SQL查询基于单一关系耗尽多对多关系?

时间:2016-11-03 11:47:28

标签: sql sqlite

我有一个包含两个表'business'和'cities'的数据库,以及一个名为'associations'的第三个多对多关系表,除了rowid之外只有两个字段:'business_id'和' city_id”。一个企业可以覆盖几个城市,一个城市可以被几个企业覆盖。

现在,我想列出每个业务以及与之关联的城市。所以我这样做:

SELECT
  businesses.rowid,
  businesses.name,
  GROUP_CONCAT(cities.name, ', ') as citylist
FROM businesses
JOIN associations ON businesses.rowid = associations.business_id
JOIN cities ON cities.rowid = associations.city_id
GROUP BY businesses.rowid

这完美无缺。但我在实践中想要做的只是列出与特定城市相关的业务 - 以完全相同的方式。但我没有找到一种方法,不会让GROUP_CONCAT(cities.name, ', ')只返回给定的城市,而不是所有与业务相关的城市。

作为一个随机的例子,如果给予城市“纽约”,我会想要这样的结果:

0: [rowid] = 42
   [name] = Generic Business
   [citylist] = New York, Jamestown, Albany
1: [rowid] = 31
   [name] = Arbitrary Ltd.
   [citylist] = Fulton, New York, Lockport

如果对解决方案很重要,我目前正在使用SQLite 3,但我并不完全反对在必要时进行更改。

1 个答案:

答案 0 :(得分:1)

使用having子句;

SELECT b.rowid, b.name,
       GROUP_CONCAT(c.name, ', ') as citylist
FROM businesses b JOIN
     associations a
     ON b.rowid = a.business_id JOIN
     cities c
     ON c.rowid = a.city_id
GROUP BY b.rowid, b.name
HAVING SUM(CASE WHEN c.name = 'New York' THEN 1 ELSE 0 END) > 0;

注意:

  • 表别名(abc)使查询更易于编写和阅读。
  • 为了清晰起见,我更倾向于将SELECT中的所有未加聚合的列放在GROUP BY中。