gpt4 book ai didi

php - mysql 带计数的多组查询

转载 作者:行者123 更新时间:2023-11-29 14:46:09 25 4
gpt4 key购买 nike

我有这个查询

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com