mysql 带计数的多组查询

发布于 2024-11-27 21:14:35 字数 4869 浏览 1 评论 0原文

我有这个查询

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 作为这两种语言的计数器。

编辑添加表结构

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

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

I have this query

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

This is complicated to explain without having the tables on your screen but I'll try
what I want is count all the rows from products_list that can be associated with max two rows per id_cat_unique (contained in products_categories_list) that are English or Italian. This two items each could have infinite id_products in products_list of course.
I want the result to be grouped by products_categories_list.name_cat and by the language.
What I get with this query is categories grouped by name/unique id which is correct, the problem is that the counter value for both English and Italian turns out as the sum of all the products associated with one id_cat_unique regardless of the language. So if I have 12 rows from one category in English and 3 for the same category in Spanish I get 15 as counter for both the languages.

EDIT ADDING TABLES STRUCTURES

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)

result from query

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

"Pork meat" and "Carne di Suino" have respectively 1 and 5 products (from the same category but different language, i wanna group the counting by language too) instead it shows 6 for both

NEW question

I'd like to use this query for many purposes without using different things, so accordingly if I want to retrieve the categories with ONE language I'd add one where clause

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

I get Unknown column 'products_list.lang' in 'where clause'. Why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

阳光的暖冬 2024-12-04 21:14:35

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

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(*))。

I THINK this will work, if not, it's going to be close, let me know what you get, and I can modify it. I've modified the query around. Would this work?

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

The PCL and PL are just aliases for the tables, so I didn't have to always write out products_categories_list and products_list. You specify the alias in the from part of the statement, so from products_list pl allows you to refer to products_list as pl in the rest of the query.

The idea behind this is that you have a unique row for each products_categories_list and you want a count of a secondary table. This could have been done by group by or by a sub query. I put the correlated subquery in to count the number of rows in products_list that matched the products_categories_list and language, since you are getting all the columns out of the products_categories_list. The correlated subquery allows you to get a single value (count(*)) from a nested query.

叫思念不要吵 2024-12-04 21:14:35

可能是这样: add DISTINCT

COUNT(DISTINCT products_list.id_cat_unique) as counter

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

Probably this: add DISTINCT

COUNT(DISTINCT products_list.id_cat_unique) as counter

This will ignore duplicate, so the 12+3 via the JOIN becomes 1+1

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文