MySQL многопользовательский запрос с количеством - PullRequest
0 голосов
/ 03 августа 2011

У меня есть этот запрос

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'. Почему?

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Я думаю, что это сработает, если нет, то будет близко, дайте мне знать, что вы получите, и я могу изменить это. Я изменил запрос вокруг. Будет ли это работать?

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_list pl позволяет ссылаться на products_list как pl в остальной части запроса.

Идея этого заключается в том, что у вас есть уникальная строка для каждого products_categories_list, и вы хотите подсчитать дополнительную таблицу. Это могло быть сделано по группам или подзапросом. Я поместил коррелированный подзапрос, чтобы подсчитать количество строк в products_list, которые соответствуют products_categories_list и language, так как вы получаете все столбцы из products_categories_list. Коррелированный подзапрос позволяет вам получить одно значение (count (*)) из вложенного запроса.

0 голосов
/ 03 августа 2011

Вероятно, это: добавьте DISTINCT

COUNT(DISTINCT products_list.id_cat_unique) as counter

Это будет игнорировать дубликаты, поэтому 12 + 3 через JOIN становится 1 + 1

...