我们的系统是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
}
}
,但不确定这是否是处理此问题的最佳方法。预先感谢您的帮助。
听起来像是对我的“ 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;
再见!
我认为您希望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;