【问题标题】:Finding count and data in single mysql query在单个 mysql 查询中查找计数和数据
【发布时间】:2014-02-20 08:48:46
【问题描述】:

我有两张桌子。城市,地区。

Cities:  
    id | name  
Localities:  
    id | city_id | name

我可以通过一次查询来获取城市的地点列表(每个城市只有 10 行),以及该城市的地点数吗?

我知道我可以在 2 个不同的查询中做到这一点。

请建议是否可以使用 Django 查询集来完成。

型号:

class City(models.Model):
    name = models.CharField(max_length=200)    

class Locality(models.Model):
    name = models.CharField(max_length=200)
    city = models.ForeignKey(City,related_name='LocalityCity')

【问题讨论】:

  • 您的结果应该是什么样子?每个位置一行显示一列中的计数?每个地方一排加上一排显示计数?每个城市一行显示地区和计数?
  • 每个城市的 10 行地点,以及该城市的实际计数。例如。 city1,locality1,13city1,locality2,13city1,locality3,13...等等直到city1,locality10,13,然后city2,locality14,8直到city2,locality15,8等等所有城市。

标签: mysql sql django


【解决方案1】:
select * from
( select c.id as city_id, count(l.id) as "localities count per city"
  from cities as c
  inner join localities as l on l.city_id = c.id ) as localities_count_per_city
inner join
( select c.id as city_id, c.name, l.name
  from cities as c
  inner join localities as l on l.city_id = c.id
  limit 10) as localities_per_city ) as localities_per_city
on localities_count_per_city.city_id = localities_per_city.city_id

这应该将每个城市计数的各个地方与城市行中的每个地方连接起来。

【讨论】:

    【解决方案2】:

    您应该提到的是模型而不是 SQL 表模式。以下是查询它们的方法:

    cities = City.objects.annotate(num_cities=Count("locality"))
    for city in cities:
        print(city.locality_set, city_num_cities)
    

    【讨论】:

    【解决方案3】:

    我可以进行一次查询以获取 城市(每个城市只有 10 行),也是地方的计数 那个城市?

    假设您的模型是:

    class Locality(models.Model):
        name = models.CharField(max_length=200)    
    
    class City(models.Model):
        name = models.CharField(max_length=200)
        locality = models.ManyToMany(Locality)
    

    你可以得到这样的结果:

    all_cities = City.object.all()
    for city in all_cities:
       print('City: {} Total Localities: {}'.format(city.name, city.locality_set.count()))
       for loc in city.locality_set.all():
           print('\t{}'.format(loc.name))
    

    在上面的 sn-p 中,有 两个 查询正在执行 - 但 django 查询集被缓存,因此您可以放心每次都执行正确的查询。

    如果你想一次完成,那么你需要使用聚合:

    from django.db.models import Count
    
    all_cities = City.objects.all().annotate(localities=Count('locality'))
    for city in all_cities:
       print('City: {} Total Localities: {}'.format(city, city.localities))
    

    【讨论】:

    • 你能根据我提到的模型更正你的答案吗?
    • 试试看能不能自己做,有没有遇到问题;然后问。
    猜你喜欢
    • 1970-01-01
    • 2019-01-12
    • 2021-06-02
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多