Mysql: количество строк в другой таблице

318
30 июля 2017, 08:23

Тестовая структура:

CREATE TABLE a (
  id INT
);
CREATE TABLE b (
  id INT,
  a_id INT,
  sum INT  
);
INSERT INTO a SET id=1;
INSERT INTO b SET id=1, a_id=1, sum=2;
INSERT INTO b SET id=2, a_id=1, sum=3;

Надо в один селект получить для каждой строки из a количество записей из b с a_id равным id текущей строки, и сумму всех полей sum. Если таких записей нет, строка из a все равно должна оставаться в выдаче. Как писать не представляю совсем, кроме того, что с join.

Пример выдачи:

id -- count(*) -- sum(sum)
1  --  2       --  5
Answer 1

В принципе всё ровно так, как вы и написали в условии: считаются count и sum группируя по a_id. А в целом таблица а джойнит как раз-таки ту таблицу с группировкой.

SELECT a.id, tmp.*
FROM a
LEFT JOIN (SELECT b.a_id, COUNT(b.a_id) as `count`, SUM(`sum`) as summa
            FROM b
            GROUP BY b.a_id
) tmp
ON tmp.a_id = a.id

В итоге если для a нет записей в b - то там будут null

http://sqlfiddle.com/#!9/35471b/8

Answer 2
SELECT `a`.`id`, SUM(`b`.`sum`), COUNT(*)
FROM `a`
LEFT JOIN `b` ON `a`.`id`=`b`.`a_id`
GROUP BY `a`.`id`;

На фидле получил результат как у вас

READ ALSO
Как работает Varargs с коллекциями?

Как работает Varargs с коллекциями?

Недавно наткнулся на такой пример :

250
Собрать файл из байтов используя только heap

Собрать файл из байтов используя только heap

В DB есть файл изображение в виде массива байтов, который нужно отдать клиенту через сервлетВ nio есть конструкция в Files

322
JSP использование forEach для вложенных классов

JSP использование forEach для вложенных классов

Всем приветВозник вопрос в том как использовать значения внутренних классов

335
JAVA лицензионное соглашение

JAVA лицензионное соглашение

Как можно предложить пользователю принять лицензионное соглашение, до запуска программы?

307