SQL:每个地区的商店类别计数器

问题描述 投票:0回答:2

我们的系统是articles的基本列表。每个articles属于给定的category和给定的locality。当用户来到我们的应用程序时,他们选择一个开始的地区。我们的结构的简单表示如下:

[类别表

|---------------------|------------------|
|          id         |       Name       |
|---------------------|------------------|
|          1          |       Bike       |
|---------------------|------------------|
|          2          |      Garden      |
|---------------------|------------------|

地区表

|---------------------|------------------|
|          id         |       Name       |
|---------------------|------------------|
|          1          |     New York     |
|---------------------|------------------|
|          2          |       Paris      |
|---------------------|------------------|

文章表

|---------------------|------------------|------------------|------------------|
|          id         |       Name       |    Category ID   |    Locality ID   |
|---------------------|------------------|------------------|------------------|
|          1          |   Super title    |         2        |         1        |
|---------------------|------------------|------------------|------------------|
|          2          |   Eiffel Tour    |         1        |         2        |
|---------------------|------------------|------------------|------------------|

根据我们的需要,我们现在需要显示所选articles的每个category有多少locality。一个人将如何处理呢?您将如何在数据库级别存储它?效率如何? (我们有400多个类别,大约200个地区)我们正在考虑使用JSON列(Postgres):

{
  "New York": {
    "Bike": 0,
    "Garden": 1
  },
  "Paris": {
    "Bike": 1,
    "Garden": 0
  }
}

,但不确定这是否是处理此问题的最佳方法。预先感谢您的帮助。

sql postgresql counter
2个回答
0
投票

听起来像是对我的“ count + group by”查询:

SELECT Category_ID, COUNT(*) 
FROM Articles_table 
GROUP BY Category_ID;

为了避免子咨询,您可以尝试一些左联接。

SELECT Categories_table.Name, COUNT(Articles_table.Category_ID)
FROM Articles_table
LEFT JOIN Categories_table 
ON Articles_table.Category_ID = Categories_table.ID
GROUP BY Categories_table.Name;

我希望这对您有用。

最好的问候。

编辑

很抱歉,我忘记了位置ID的条件。假设所选位置是数字id = 2:

SELECT Categories_table.Name, COUNT(Articles_table.Category_ID)
FROM Articles_table
LEFT JOIN Categories_table 
ON Articles_table.Category_ID = Categories_table.ID
WHERE Articles_table.Locality_ID = 2
GROUP BY Categories_table.Name; 

如果不起作用,请尝试(效率较低):

SELECT Categories_table.Name, COUNT(Articles_table.Category_ID)
FROM Articles_table
LEFT JOIN Categories_table 
ON Articles_table.Category_ID = Categories_table.ID
AND Articles_table.Locality_ID = 2
GROUP BY Categories_table.Name;

再见!


0
投票

我认为您希望cross join生成行,然后left join填写结果:

select l.name, c.name, count(a.id)
from localities l cross join
     categories c left join
     articles a
     on a.locality_id = l.id and a.category_id = c.id
group by c.name, l.name;
© www.soinside.com 2019 - 2024. All rights reserved.