2013-01-18 5 views
3

У меня есть две таблицы:Группа по типу рейтинга?

ab_message

  • user_id
  • название
  • содержание
  • вопрос

и ab_message_rating:

  • ID
  • идентификатор_пользователя
  • message_id
  • created_at
  • updated_at

ab_message находится в OneToMany связь с ab_message_rating. Каждая запись в ab_message_rating имеет 1, 2 или 3 в качестве номинального значения.

Так что я хочу выбрать в одном запросе сообщение Все связанные записи таблиц. Ключ - это то, что мне нужно в этом рейтинге запроса засчитываться значение BY.

Для примера Результата Schuld быть:

Сообщения а имеют 5 записей о рейтинге 1, 7 записей по рейтингу 2 и 10 вхождений рейтинга 3

, как сделать это в запрос? Что-то вроде Group By и A Join?

ответ

3
SELECT ID, Title, Content, 
     MAX(CASE WHEN Rating = 'Rating 1' THEN totalCount ELSE NULL END) 'Rating 1', 
     MAX(CASE WHEN Rating = 'Rating 2' THEN totalCount ELSE NULL END) 'Rating 2', 
     MAX(CASE WHEN Rating = 'Rating 3' THEN totalCount ELSE NULL END) 'Rating 3' 
FROM  
(
    SELECT a.ID, a.Title, a.Content, 
      b.Rating, COUNT(*) totalCount 
    FROM Message a 
      LEFT JOIN Rating b 
       ON a.ID = b.MessageID 
    GROUP BY a.ID, a.Title, a.Content, b.Rating 
) r 
GROUP BY ID, Title, Content 

Пример Результат:

╔════╦═══════════════╦══════════╦══════════╦══════════╦══════════╗ 
║ ID ║  TITLE  ║ CONTENT ║ RATING 1 ║ RATING 2 ║ RATING 3 ║ 
╠════╬═══════════════╬══════════╬══════════╬══════════╬══════════╣ 
║ 1 ║ Lost Prophets ║ CONTENT1 ║  1 ║  5 ║  7 ║ 
║ 2 ║ Cannibal  ║ CONTENT2 ║  3 ║  4 ║  6 ║ 
║ 3 ║ Sigbin  ║ CONTENT3 ║  4 ║  4 ║  1 ║ 
╚════╩═══════════════╩══════════╩══════════╩══════════╩══════════╝ 
+0

Привет JW, я пытался адаптировать свой запрос к моя схема, но я получил: ERROR 1054 (42S22): Неизвестный столбец 'b.rating' в 'списке полей' здесь запрос: – smartius

+0

SELECT id, title, content, MAX (CASE WHEN b.rating = '1' THEN totalCount ELSE NULL END) '1', MAX (CASE WHEN b.rating = '2' THEN totalCount ELSE NULL END) '2', MAX (случай, когда b.rating = '3', то TOTALCOUNT ИНАЧЕ NULL КОНЕЦ) '3' ОТ ( SELECT, a.id, a.title, a.content, b.rating, COUNT (*) TOTALCOUNT ОТ ab_message в LEFT JOIN ab_message_rating б ПО a.id = b.message_id GROUP BY a.id, a.title, a.content, b.rating ) R GROUP BY ID, название, content – smartius

+0

Извините, попробуйте еще раз, 'b.' следует удалить. –

0

This не очень эффективный или довольно, но это будет функционально:

select concat('Message "', m.title , '" has ', 
    cast((select count(*) 
     from Table_Rating r 
     where r.message_id = m.id 
     and rating = 1) as char), 
    ' entries of rating 1, ', 
    cast((select count(*) 
     from Table_Rating r 
     where r.message_id = m.id 
     and rating = 2) as char), 
    ' entries of rating 2, and ', 
    cast((select count(*) 
     from Table_Rating r 
     where r.message_id = m.id 
     and rating = 3) as char), 
    ' entries of rating 3') as FullMessage 
from Table_Message m 
0
SELECT 'Message '+ m.title + ' has ' + 
    -- ISNULL(z.Rating1/2/3,0) because z.Rating1/2/3 could be NULL (see OUTER APPLY + Table_Rating may not have rows) 
    CONVERT(VARCHAR(11), ISNULL(z.Rating1,0)) + 'entries of rating 1, ' + 
    CONVERT(VARCHAR(11), ISNULL(z.Rating2,0)) + 'entries of rating 2, and '+ 
    CONVERT(VARCHAR(11), ISNULL(z.Rating3,0)) + 'entries of rating 3' AS Description 
FROM Table_Message tm 
OUTER APPLY (
    SELECT y.[1] AS Rating1, y.[2] AS Rating2, y.[3] AS Rating3 
    FROM (
     -- This query will generate 0, 1, 2 or 3 rows because of GROUP BY r.Rating 
     SELECT r.Rating, COUNT(*) as Cnt 
     FROM Table_Rating r 
     WHERE r.message_id = m.id 
     GROUP BY r.Rating 
    ) x 
    -- The PIVOT operator will transponse (it converts rows into columns) the source rows (alias x) into just one row with 3 columns: 
    -- [1] = COUNT for Rating 1, [2] = COUNT for Rating 2, [3] = COUNT for Rating 3 
    PIVOT (MAX(x.Cnt) FOR x.Rating IN ([1], [2], [3])) y 
) z 
+0

Я бы не стал классифицировать это как ответ в текущей форме. Пожалуйста, добавьте объяснение и/или более подробную информацию, чтобы было очевидно, что изменилось. Более подробное описание также помогает будущим посетителям понять, как исправить их проблему. – Bojangles

+0

@JamWaffles: Я добавил комментарии к моему решению. Если у вас есть вопросы, не стесняйтесь спрашивать. –

Смежные вопросы