Как запросить COUNT для таблицы соединения и вернуть записи с ОБАМ счетом = 0 И счетом> 0 - PullRequest
0 голосов
/ 27 марта 2019

У меня есть таблица продуктов и таблица отзывов.
Я хочу написать запрос для возврата COUNT и AVG отзывов о каждом продукте.
AND если нет отзывов, я хочу, чтобы он возвращал 0 / ноль для COUNT и AVG.

таблица продуктов

+--------+----------+
| prodId | prodName |
+--------+----------+
|   1    |  apple   |
|   2    |  banana  |
|   3    |  cacao   |
+--------+----------+

таблица отзывов

+----------+----------+--------+
| reviewId |  prodId  | rating |
+----------+----------+--------+
|    1     |     1    |    1   |
|    2     |     1    |    1   |
|    3     |     2    |    5   |
|    4     |     2    |    5   |
+----------+----------+--------+

это то, что я хочу, чтобы результат был похож:

+--------+----------+--------+-------+
| prodId | prodName |   avg  | count |
+--------+----------+--------+-------+
|   1    |  apple   |    1   |   2   |
|   2    |  banana  |    5   |   2   |
|   3    |  cacao   |   null |   0   |
+--------+----------+--------+-------+

Я могу получить COUNT и AVG для продуктов с отзывами

SELECT p.prodid, p.prodname, avg(r.stars), count(r.productid)
FROM products p 
INNER JOIN reviews r ON p.productid=r.productid 
GROUP BY p.productid
+--------+----------+--------+-------+
| prodId | prodName |   avg  | count |
+--------+----------+--------+-------+
|   1    |  apple   |    1   |   2   |
|   2    |  banana  |    5   |   2   |
+--------+----------+--------+-------+

Я также могу получить COUNT и AVG для продукта без отзывов

SELECT p.prodid, p.prodname, avg(r.stars), count(r.stars)
FROM products p
LEFT OUTER JOIN reviews r 
ON (p.productid=r.productid) WHERE r.productid IS NULL
GROUP BY p.productid
+--------+----------+--------+-------+
| prodId | prodName |   avg  | count |
+--------+----------+--------+-------+
|   3    |  cacao   |   null |   0   |
+--------+----------+--------+-------+

Но я не знаю, есть ли у MySql способ запрашивать и подсчитывать результаты, которые совпадают, и подсчитывать результаты, которые не совпадают в одном запросе.

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

На практике для MySQL «LEFT JOIN» аналогично LEFT OUTER JOIN.Ключевое слово OUTER необязательно.Для достижения результата вам просто нужно выполнить простое «LEFT JOIN» и сгруппировать по ID (или любому другому уникальному ключу):

SELECT 
    `p`.`prodId` AS `ID`, 
    `p`.`prodName` AS `Product`, 
    avg(`r`.`rating`) AS `AVG Rating`, 
    count(`r`.`reviewId`) AS `Vote Count`
FROM `products` AS `p`
LEFT JOIN `reviews` AS `r` ON `p`.`prodId` = `r`.`prodId`
GROUP BY `p`.`prodId`
0 голосов
/ 27 марта 2019

просто удалите where condition из вашего второго запроса

SELECT p.prodid, p.prodname, avg(r.stars), count(r.stars)
FROM products p
LEFT OUTER JOIN reviews r 
ON p.productid=r.productid
GROUP BY p.productid,p.prodname
...