我有这个查询
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'
。为什么呢?
答案 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部分指定别名,因此
这背后的想法是每个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