Сложна MySQL-заявка: Вземете име на обект и брой и средна стойност на всички внуци

Имам оценки, които представляват оценка на продукт.
Тези оценки имат стойност (цяло число между 1 и 5), product_id и rating_type_id.

Оценките имат връзка много към едно с rating_types. rating_types имат отношение много към едно към rating_categories. Значение: one rating_category има several rating_types, а one rating_types има several ratings.

Освен това всеки продукт има връзка много към много с rating_categories. Това означава, че даден продукт може да бъде оценен само от рейтинги, чийто rating_type принадлежи към тези rating_categories.

За даден product_id бих искал да извлека за всяка rating_category името на категорията, броя на всички оценки и средната стойност на всички оценки. Тези оценки имат product_id като външен ключ и трябва да имат rating_type като externalkey, чийто rating_type има rating_category като externalKey.

Това е моето запитване досега, но е грешно:

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
Не съм сигурен, но представянето не е ли наистина лошо? Не трябва ли да използвате Joins? - person Pascal Klein; 07.12.2010
comment
Производителността би била толкова добра, колкото db optimizer, който се развива с подобрения на db двигателя. Групирането не е бавно, когато имате индекси на първичните ключове на всички таблици. Освен това можете да използвате обяснение dev.mysql.com/doc/refman/5.0 /en/explain.html за проверка на ефективността. - person too; 07.12.2010