2015-04-16 9 views
4

Я пытаюсь установить GROUP, SORT и COUNT в одном запросе один из моих таблиц с именем «товары».Группа, сортировка и подсчет в одном запросе

Вот упрощение моей MySql таблицы:

family sub_family name  detailed_name 
Agro Grains  Wheat  Wheat per 1 mt 
Agro Grains  Corn  Corn per 1 mt 
Agro Grains  Sugar  Sugar per 1 mt 
Agro Fruits  Apple  Apple red 
Agro Fruits  Apple  Apple green 
Agro Fruits  Apple  Apple yellow 
Agro Fruits  Lemon  Lemon classic 
Wood Tree  Lemon  Lemon in logs 
Wood Tree  Oak   Oak in logs 
Wood Tree  Epicea  Epicea in logs 
Wood Packaging Kraftliner Krafliner 3mm 

Я хотел бы:

  1. GROUP по name
  2. SORT по family, sub_family и, наконец, name
  3. COUNT N umbers строк для каждого family, sub_family и затем name (В ОДНОМ sub_family)

До сих пор мне удалось сделать все, но COUNT в том же sub_family.

Действительно, следующий запрос:

SELECT 
    TableC.family, 
    TableC.NbrFamily, 
    TableB.sub_family, 
    TableB.NbrSubFamily, 
    TableA.name, 
    TableA.NbrName 
FROM 
(
    SELECT 
     family, 
     sub_family, 
     name, 
     COUNT(DISTINCT commodities.id) AS NbrName 
    FROM commodities GROUP BY name 
) TableA 
INNER JOIN 
(
    SELECT 
     sub_family, 
     COUNT(DISTINCT commodities.id) AS NbrSubFamily 
    FROM commodities GROUP BY sub_family 
) TableB 
ON (TableA.sub_family = TableB.sub_family) 
INNER JOIN 
(
    SELECT 
     family, 
     COUNT(DISTINCT commodities.id) AS NbrFamily 
    FROM commodities GROUP BY family 
) TableC 
ON (TableA.family = TableC.family) 
GROUP BY TableA.name 
ORDER BY TableA.family,TableA.sub_family,TableA.name 

, что приводит к следующему:

family NbrFamily sub_family NbrSubFamily name  NbrName 
Agro 7   Grains  3    Wheat  1  
Agro 7   Grains  3    Corn  1   
Agro 7   Grains  3    Sugar  1  
Agro 7   Fruits  4    Apple  3 
Agro 7   Fruits  4    Lemon  2 
Wood 4   Tree  3    Lemon  2 
Wood 4   Tree  3    Oak   1  
Wood 4   Tree  3    Epicea  1 
Wood 4   Packaging 1    Kraftliner 1 

Вы можете видеть, что NbrName засчитываются Лимонный 2 раза, но я хотел бы, чтобы считать это только 1 раз, потому что один лимон находится в Фруктыsub_family, а другой в Деревоsub_family.

[UPDATE]: Вот мои желаемые результаты:

family NbrFamily sub_family NbrSubFamily name  NbrName 
    Agro 7   Grains  3    Wheat  1  
    Agro 7   Grains  3    Corn  1   
    Agro 7   Grains  3    Sugar  1  
    Agro 7   Fruits  4    Apple  3 
    Agro 7   Fruits  4    Lemon  1 
    Wood 4   Tree  3    Lemon  1 
    Wood 4   Tree  3    Oak   1  
    Wood 4   Tree  3    Epicea  1 
    Wood 4   Packaging 1    Kraftliner 1 
+0

Как вы можете сортировать по столбцам, которые имеют несколько значений для ваших групп? Я думаю, вы в замешательстве. Измените свой запрос и укажите ваши * желаемые * результаты. –

+0

Согласно вашему сообщению ** «Лимон» 2 раза, но я хотел бы, чтобы он считал его всего 1 ** в соответствии с вашим желаемым результатом ** Агро 7 Фрукты 4 Лимон 2 Дерево 4 Дерево 3 Лимон 2 ** так что твой реальная цель? – Alex

+0

Мой вопрос, вероятно, недостаточно ясен. Как вы можете видеть, «Лимон» получает 2 раза за каждый лимон (один из «суффиксов» «Фрукты», а другой - в «Дереве» sub_family). Но я хотел бы считать это всего лишь 1 раз, так как два «Лимона» НЕ принадлежат к тому же sub_family. Один - это плод, а другой - дерево. – SuperKiwi

ответ

2

Просто мое предположение о том, что вы просите http://sqlfiddle.com/#!9/e9206/16

, потому что это приносит желаемый результат:

SELECT A.family, C.NbrFamily,A.sub_family,B.NbrSubFamily,A.name,COUNT(A.Name) 
FROM commodities as A 
LEFT JOIN (
    SELECT family,sub_family,COUNT(Name) AS NbrSubFamily 
    FROM commodities 
    GROUP BY family,sub_family 
) B 
ON A.sub_family = B.sub_family 
    AND A.family = B.family 
LEFT JOIN (
    SELECT family,COUNT(Name) AS NbrFamily 
    FROM commodities 
    GROUP BY family 
) C 

ON A.family = C.family 
GROUP BY A.family,A.sub_family,A.name 
ORDER BY A.id 
+0

Вот оно.Большое спасибо, Алекс. – SuperKiwi

Смежные вопросы