Используя команду GROUP BY, можно СЛЕДУТЬ СОЕДИНЯТЬ несколько таблиц и при этом получить желаемое количество строк из первой таблицы.
Например,
SELECT b.title
FROM books `b`
LEFT JOIN orders `o`
ON o.bookid = b.id
LEFT JOIN authors `a`
ON b.authorid = a.id
GROUP BY b.id
Однако, поскольку за сценой MYSQL выполняет декартово произведение для таблиц, если вы включите более одной команды SUM, вы получите неправильные значения на основе всех скрытых строк. (Проблема здесь объяснена довольно хорошо.)
SELECT b.title,SUM(o.id) as sales,SUM(a.id) as authors
FROM books `b`
LEFT JOIN orders `o`
ON o.bookid = b.id
LEFT JOIN authors `a`
ON b.authorid = a.id
GROUP BY b.id
На SO есть несколько ответов , большинство из которых используют подзапросы в JOINS но у меня возникают проблемы с применением их в этом довольно простом случае.
Как настроить вышеуказанное так, чтобы получить правильные суммы?
Редактировать
Пример
books
id|title|authorid
1|Huck Finn|1
2|Tom Sawyer|1
3|Python Cookbook|2
orders
id|bookid
1|1
2|1
3|2
4|2
5|3
6|3
authors
id|author
1|Twain
2|Beazley
2|Jones
The «правильный ответ» для общего числа авторов Python Кулинарной книги равен 2. Однако, поскольку существует два объединения, а общий набор данных расширяется путем объединения по числу заказов, SUM (a.id) будет равно 4.