У меня есть этот запрос
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
и по языку.
Что я получаю с этим запросом, это категории, сгруппированные по имени / уникальному идентификатору, что правильно, проблема в том, что значение 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'
. Почему?