php - mysql 带计数的多组查询

标签 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 中)关联的英语或意大利语。当然,这两个项目在 products_list 中都可以有无限的 id_products 。 我希望结果按 products_categories_list.name_cat 和语言进行分组。 我通过此查询得到的是按名称/唯一 ID 分组的类别,这是正确的,问题是英语和意大利语的 counter 值结果是与一个 id_cat_unique 关联的所有产品的总和无论语言如何。因此,如果我有 12 行来自一个英语类别,3 行来自西类牙语的同一类别,我会得到 15 作为这两种语言的计数器。

编辑添加表结构

产品列表

+-------------------+--------------+------+-----+---------+----------------+
| 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)

产品类别_ids

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

产品类别列表

+---------------+--------------+------+-----+---------+----------------+
| 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)

“ pig 肉”和“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

我在“where 子句”中得到未知列“products_list.lang”。为什么?

最佳答案

我认为这会起作用,如果没有,它会很接近,让我知道你得到了什么,我可以修改它。我已经修改了周围的查询。这行得通吗?

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 都有一个唯一的行,并且您需要辅助表的计数。这可以通过 group by 或子查询来完成。我将相关子查询放入其中,以计算 products_list 中与 products_categories_list 和语言匹配的行数,因为您将从 products_categories_list 中获取所有列。相关子查询允许您从嵌套查询中获取单个值 (count(*))。

关于php - mysql 带计数的多组查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6930355/

相关文章:

mysql - 表示 SQL 约束

MYSQL计算不同数据取决于if条件

php - php add 函数中未定义索引

javascript - 在 PHP 中单击复选框时如何禁用输入?

mysql - 加入 3000 多张 table

mysql - Laravel:根据另一个表中的其他数据选择数据

r - 基于变量中前 N 个最频繁值的子集数据框

jquery - Droppable 的值计数 (JQuery)

php - 身份验证/登录中的凭据错误 - Symfony2

php - 关于获取通用模拟对象的简单 PHPUnit 之一