2016-12-19 2 views
2

У меня есть две таблицы:SUM в LEFT JOIN запрос

Table products 
ID Name   Base  
1  Product_1 5 
2  Product_2 4 

Table orders 
ID Product_ID  
1  1    
2  1   
3  2 

Я использую этот запрос:

SELECT products.ID, products.Base, COUNT(orders.ID) AS Counter 
FROM products 
LEFT JOIN orders ON products.ID = orders.Product_ID 
GROUP BY products.ID 

получить:

ID Base Counter 
1  5  2 
2  4  1 

То, что я хочу сделать сейчас заключается в том, чтобы написать запрос, который вернет таблицу, подобную приведенной выше, но с дополнительным столбцом SUM - сумма базы и счетчика:

ID Base Counter SUM 
1  5  2   7 
2  4  1   5 

Возможно ли достичь этого результата, используя один запрос? Я также хотел бы заказать мои результаты по столбцу SUM.

+1

Просто добавьте ', products.Base + COUNT (orders.ID) как Sum' после' As counter', если мы можем предположить, что products.base является числовым, а затем 'ORDER BY Sum' после' GROUP BY' – xQbert

+0

@xQbert Спасибо, это именно то, что мне нужно! – bloo79

ответ

3

Не переусердствуйте. Просто добавьте их вместе со знаком «плюс».

SELECT products.ID, products.Base, COUNT(orders.ID) AS Counter, 
products.Base + COUNT(orders.ID) as `SUM` 
FROM products 
LEFT JOIN orders ON products.ID = orders.Product_ID 
GROUP BY products.ID 
ORDER BY `SUM` 

Примечание: «SUM» это имя агрегатной функции SQL, так что вы должны будете окружить его в обратные кавычки для того, чтобы использовать его в качестве псевдонима столбца. Подумайте об использовании другого имени.

1
SELECT products.ID, products.Base, COUNT(orders.ID) AS Counter, products.Base + COUNT(orders.ID) as `sum` 
FROM products 
LEFT JOIN orders ON products.ID = orders.Product_ID 
GROUP BY products.ID, products.Base 
ORDER BY `sum` DESC 

Всегда включайте ВСЕ неагрегационные столбцы в разделе group by. См. https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

Как вы увидите в этой ссылке, MySQL имеет нестандартное расширение для группировки, которое позволяет использовать смягченный синтаксис запроса. Однако результаты полагаются на MySQL, делающий произвольный выбор для достижения группировок. Кроме того, если параметр ONLY_FULL_GROUP_BY изменяется в любой момент, если вы будете следовать синтаксическим правилам SQL, ваш запрос останется в силе, если вы включите все неагрегационные столбцы в разделе group by.

+1

Как правило, я бы согласился, но как products.Id, по-видимому, является первичным ключом, основанным на соединении с заказами и образцами данных, у products.base может быть только 1 значение. Поэтому в этом случае группа mySQL по расширению действительно не имеет значения. поскольку для этого всегда есть только одно значение. Это, однако, предположение, что идентификатор является первичным ключом. по вашей ссылке ", сервер может выбирать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются неопределенными,« если есть только одно значение, которое он должен выбрать 1. так что он всегда будет правильным , поэтому в этом случае не группировка по ним может быть быстрее. – xQbert

+0

Даже если первичный ключ, если значение параметра изменено, запрос может выйти из строя. Поэтому я твердо верю, что это всегда хороший совет по этой теме. –

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