带有count的mysql多组查询

时间:2011-08-03 17:09:22

标签: php mysql count group-by

我有这个查询

SELECT 
   products_list.id_cat_unique,
   products_categories_list.*,
   COUNT(products_list.id_cat_unique) as counter
FROM products_categories_ids
LEFT JOIN products_list 
   ON products_categories_ids.id_cat_unique = products_list.id_cat_unique
LEFT JOIN products_categories_list 
   ON products_categories_list.id_cat_unique = products_categories_ids.id_cat_unique 
GROUP BY products_categories_list.name_cat
ORDER BY products_categories_list.name_cat ASC

如果没有屏幕上的表格,这很难解释,但我会试试 我想要的是计算来自products_list的所有行,这些行可以与每id_cat_unique(包含在products_categories_list)中最多两行(英语或意大利语)相关联。这两个项目当然可以在id_products中具有无限products_list。 我希望结果按products_categories_list.name_cat和语言分组。 我通过此查询获得的是按名称/唯一ID分组的类别,这是正确的,问题是英语和意大利语的counter值都是与一个id_cat_unique关联的所有产品的总和,无论语言。因此,如果我在英语中有一个类别有12行,而在西班牙语中有3个相同类别,那么我会得到15个作为这两种语言的计数器。

编辑添加表格结构

products_list

+-------------------+--------------+------+-----+---------+----------------+
| Field             | Type         | Null | Key | Default | Extra          |
+-------------------+--------------+------+-----+---------+----------------+
| id_product        | int(11)      | NO   | PRI | NULL    | auto_increment |
| id_product_unique | int(5)       | NO   |     | NULL    |                |
| lang              | varchar(2)   | NO   |     | NULL    |                |
| name_product      | varchar(200) | NO   |     | NULL    |                |
| desc_product      | text         | NO   |     | NULL    |                |
| id_cat_unique     | int(2)       | NO   |     | NULL    |                |
| status            | int(1)       | NO   |     | NULL    |                |
+-------------------+--------------+------+-----+---------+----------------+
12 rows in set (0.00 sec)

products_categories_ids

+---------------+--------+------+-----+---------+----------------+
| Field         | Type   | Null | Key | Default | Extra          |
+---------------+--------+------+-----+---------+----------------+
| id_cat_unique | int(5) | NO   | PRI | NULL    | auto_increment |
+---------------+--------+------+-----+---------+----------------+
1 row in set (0.00 sec)

products_categories_list

+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| id_cat        | int(5)       | NO   | PRI | NULL    | auto_increment |
| id_cat_unique | int(2)       | NO   |     | NULL    |                |
| lang          | varchar(2)   | NO   |     | NULL    |                |
| name_cat      | varchar(500) | NO   |     | NULL    |                |
| date_created  | int(11)      | NO   |     | NULL    |                |
| date_modified | int(11)      | NO   |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)

查询结果

| id_cat_unique | id_cat | id_cat_unique | lang | name_cat                       | date_created | date_modified | counter |
+---------------+--------+---------------+------+--------------------------------+--------------+---------------+---------+
|             1 |     18 |             1 | it   | Carne di suino                 |   1308267538 |    1308267538 |       6 |
|            14 |     21 |            14 | it   | Guanciali                      |   1308777322 |    1308777322 |       2 |
|             3 |     20 |             3 | it   | Pollo a pezzi                  |   1308267892 |    1308267892 |       2 |
|             1 |     22 |             1 | en   | Pork meat                      |   1308267538 |    1312383232 |       6 |
|            14 |     23 |            14 | en   | Sheeps                         |   1308777322 |    1312383220 |       2 |
|             2 |     19 |             2 | it   | That's a "test" |   1308267538 |    1308267538 |       7 |
+---------------+--------+---------------+------+--------------------------------+--------------+---------------+---------+
6 rows in set (0.00 sec)

“猪肉”和“Carne di Suino”分别有1个和5个产品(来自同一类别但不同的语言,我也想按语言分组)而不是显示6个

新问题

我想在不使用不同内容的情况下将此查询用于多种用途,因此如果我想使用一种语言检索类别,我会添加一个where子句

select pcl.*,
   (select count(*) from products_list pl 
       where pcl.id_cat_unique = pl.id_cat_unique 
         and pcl.lang = pl.lang) as counter
from products_categories_list pcl
where products_list.lang = 'en' <- added
ORDER BY pcl.name_cat ASC

我得到Unknown column 'products_list.lang' in 'where clause'。为什么呢?

2 个答案:

答案 0 :(得分:1)

我认为这会有效,如果没有,它会很接近,让我知道你得到了什么,我可以修改它。我已修改了查询。这会有用吗?

select pcl.*,
   (select count(*) from products_list pl 
       where pcl.id_cat_unique = pl.id_cat_unique 
         and pcl.lang = pl.lang) as counter
from products_categories_list pcl
ORDER BY pcl.name_cat ASC

PCL和PL只是表的别名,所以我不必总是写出products_categories_list和products_list。您可以在语句的from部分指定别名,因此 from products_list pl 允许您在查询的其余部分中将products_list称为pl。

这背后的想法是每个products_categories_list都有一个唯一的行,并且您想要一个辅助表的计数。这可以通过分组或子查询来完成。我将相关子查询放入以计算products_list中与products_categories_list和language匹配的行数,因为您从products_categories_list中获取了所有列。相关子查询允许您从嵌套查询中获取单个值(count(*))。

答案 1 :(得分:0)

可能这样:添加DISTINCT

COUNT(DISTINCT products_list.id_cat_unique) as counter

这将忽略重复,因此通过JOIN的12 + 3变为1 + 1