Сложный MySQL-запрос: получить имя объекта, а также количество и среднее значение всех внуков

У меня есть рейтинги, которые представляют рейтинг продукта.
Эти рейтинги имеют значение (целое число от 1 до 5), product_id и rating_type_id.

Рейтинги имеют отношение «многие к одному» к rating_types. rating_types имеют отношение many_to_one к rating_categories. Значение: one rating_category имеет several rating_types, а one rating_types имеет several ratings.

Кроме того, каждый продукт имеет отношение «многие ко многим» к rating_categories. Это означает, что данный продукт может быть оценен только рейтингами, чей rating_type принадлежит этим рейтингам_категорий.

Для данного product_id я хотел бы получить для каждой rating_category название категории, количество всех оценок и среднее значение всех оценок. Эти рейтинги имеют product_id в качестве внешнего ключа и должны иметь rating_type в качестве внешнего ключа, чей rating_type имеет рейтинг_категорию в качестве внешнего ключа.

Это мой запрос до сих пор, но это неправильно:

SELECT rc.name, rc.rating_category_id,
(SELECT COUNT(*) as count, AVG(value) as average
   FROM rating
   WHERE rating_id IN (
     SELECT r.rating_id
     FROM rc // I want to reference the same rating_category rc as above
     LEFT JOIN rating_type rt
     ON rating_category_id
     LEFT JOIN rating r
     ON rating_type_id
   )
  )
FROM rating_category_4_product rc4p
LEFT JOIN rating_category rc
ON rating_category_id
WHERE rc4p.product_id = {$productId}

person Pascal Klein    schedule 07.12.2010    source источник


Ответы (1)


Это должно сработать, но не проверено.

SELECT
  rc4p.product_id,
  rc.rating_category_id,
  rc.name,
  COUNT(r.rating_id),
  AVG(r.value)
FROM
  rating_category_4_product rc4p,
  rating_category rc,
  rating_type rt,
  rating r
WHERE
  r.rating_type_id = rt.rating_type_id
  AND rt.rating_category_id = rc.rating_category_id
  AND rc.rating_category_id = rc4p.rating_category_id
  AND rc4p.product_id = {$productId}
GROUP BY
  rc4p.product_id,
  rc.rating_category_id,
  rc.name
person too    schedule 07.12.2010
comment
Я не уверен, но разве производительность не плохая? Разве вы не должны использовать соединения? - person Pascal Klein; 07.12.2010
comment
Производительность будет такой же хорошей, как у оптимизатора БД, который развивается с улучшениями движка БД. Группировка не медленная, когда у вас есть индексы по первичным ключам всех таблиц. Кроме того, вы можете использовать объяснение dev.mysql.com/doc/refman/5.0. /en/explain.html для проверки производительности. - person too; 07.12.2010