【问题标题】:How I use mysql count with select query?如何将 mysql 计数与选择查询一起使用?
【发布时间】:2015-07-25 14:56:56
【问题描述】:

我有一个这样的 mysql 选择查询:

select r.restaurant_id, r.restaurant_name, r.city_id, c.name
from restaurants r
inner join cities c on c.id = r.city_id;  

这是上面查询的结果:

+---------------+----------------------+---------+-------------+
| restaurant_id | restaurant_name      | city_id | name        |
+---------------+----------------------+---------+-------------+
|             7 | Somasiri Bake House  |       5 | Mumbai      |
|             8 | Indian    Bake House |       7 | Chennai     |
|             9 | KFC Rest             |       5 | Mumbai      |    
|            10 | Indian t             |       5 | Mumbai      |
+---------------+----------------------+---------+-------------+

现在我想显示所有可用城市以及一个城市现有的餐馆数量。

例如:孟买(3)、钦奈(1)

我在下面用 mysql COUN() 尝试过,但它对我不起作用。

SELECT c.name, count(r.city_id) AS count
FROM cities c
INNER JOIN restaurants r ON c.id = r.city_id;

谁能告诉我这有什么问题?

希望有人可以帮助我。 谢谢你。

【问题讨论】:

标签: mysql select count


【解决方案1】:
SELECT c.name, COALESCE(count(r.city_id), 0) AS count
FROM cities c
LEFT JOIN restaurants r ON c.id = r.city_id
GROUP BY c.id

【讨论】:

  • 无法获取所有可用城市。
  • 是的.. 这就是我所需要的。非常感谢
【解决方案2】:

如果您不需要餐厅数据,请使用简单的分组方式:

select c.name, count(r.city_id) as available
from cities c
left join restaurants r on c.id = r.city_id
group by r.city_id

SQLFiddle


或者,如果您也需要餐厅数据,请先从城市中选择,然后左连接到其他表,这样仍然会返回没有餐厅的城市。向计算每个城市频率的子查询添加左连接:

select
  r.restaurant_id,
  r.restaurant_name,
  c.id,
  c.name,
  coalesce(available, 0) available
from cities c
left join restaurants r on c.id = r.city_id
left join (select city_id, count(*) available from restaurants group by 1) a
  on a.city_id = r.city_id

SQLFiddle

【讨论】:

  • 波西米亚人,您的查询返回了所有可用的餐厅以及城市计数。但是我需要显示所有城市,如果这些城市有餐厅,那么我需要显示计数和城市。
  • @user3733831 您是否希望每个没有餐厅的城市的“可用”列中的值为零,并在这种情况下为餐厅详细信息显示空值?
  • 是的,它可能有城市的空值。原因是每个城市都没有餐厅,我不需要在查询中重复城市。谢谢。
  • @user3733831 试试新版本(sqlfiddle链接也更新了)
  • 是的,亲爱的.. 您的查询正在运行。但是城市名称是重复的。其实我需要city1 (3), city2 (5), city3 (8), city4 (11), city5
【解决方案3】:

这称为分组或聚合查询,您需要告诉它如何对元素进行分组。

只需添加

GROUP BY r.restaurant_id, r.restaurant_name, r.city_id, c.name

最后,在最后一个分号之前。

【讨论】:

  • 我鼓励正确使用 GROUP BY(不是 MySQL 的错误行为),方法是将 all SELECT 列添加到组中:GROUP BY r.restaurant_id, r.restaurant_name, r.city_id, c.name 使用 @987654326 @ 几乎在任何其他数据库中都是错误的。
  • 是的,它的工作原理......但它没有选择所有城市
  • @MichaelBerkowski。 . .总的来说,我同意你的看法。然而,根据 ANSI,这个特定的例子并不是不正确的行为,因为函数依赖的概念。我认为 Postgres 可能是唯一正确实现此功能的数据库,它可以充分解释这个概念 (postgresql.org/docs/9.4/static/sql-select.html)。
  • 即使没有餐厅,我们能否选择所有可用城市
  • 我同意@MichaelBerkowski,按所有未聚合的列分组是理想的。
猜你喜欢
  • 2016-03-21
  • 1970-01-01
  • 2014-12-08
  • 2014-08-02
  • 2019-01-25
  • 2012-03-05
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多