2012-03-08 2 views
0

У меня есть две таблицы:MySQL запрос с использованием CONCAT

categories =>Category_ID, Title, Description, Default_Points, Groups

transactions =>Transaction_ID, Datetime, Giver_ID, , Points, Category_ID, Reason

Преподаватели награждают очки, выбирая категорию (например, «Позитивное отношение & «Поведение») и причина (например, «Отличная работа сегодня»), которая помещает запись в таблицу transactions.

Типичная categories строка может быть:

INSERT INTO `categories` (`Category_ID`, `Title`, `Description`, `Default_Points`, `Groups`) VALUES 
(17, 'Olympic Values', 'Please clearly state the correct Olympic Value that''s being used currently in the REASON box.', 5, ''); 

Типичная transactions строка может быть:

INSERT INTO `transactions` (`Transaction_ID`, `Datetime`, `Giver_ID`, `Recipient_ID`, `Points`, `Category_ID`, `Reason`) VALUES 
(50, '2011-09-07', 35023, 90236, 5, 17, 'Excellent work during PE'); 

То, что я хотел бы попробовать и сделать, используя MySQL является составить список общих точек (т. е. SUM(transactions.Points) для КАЖДОЙ категории, с несколькими образцами Reasons.

Я бы предположил, что это должно будет использовать CONCAT ?

мне нужно:

  • SUM(transactions.Points) в категории
  • categories.title
  • 5 уникальный transactions.reason в категории

Это может выглядеть следующим ...

Points  Title     Sample 
14252  Olympic Values   Excellent work in PE!|Great display of friendship|Well done! 
15532  Outstanding Effort  Amazing work!|Worked so hard|Great piece! 

Возможно ли это?

Спасибо заранее,

ответ

1

Это GROUP_CONCAT вы хотите.

Вам нужно сделать что-то вроде этого:

SELECT SUM(t.Points), 
    c.title, 
    SUBSTRING_INDEX(GROUP_CONCAT(transactions.reasons SEPERATOR '|'), '|', 5) 
FROM transactions t JOIN categories c ON (t.Category_ID=c.Category_ID) 
GROUP BY c.Category_ID 
+0

Привет @ChrisPatrick. Это хорошо работает, кроме того, что возвращаемые причины не уникальны. Обычно, когда транзакции вводятся в базу данных, они будут состоять из 30 (размер класса), и поэтому первые 5 транзакций часто будут с одинаковым «Разумом». Есть ли что-нибудь, что вы можете добавить, чтобы сделать причины уникальными? – dunc

+0

Ах, понял! Вывешивает это как ответ, но дает вам кредит. – dunc

0

Благодаря ответ @ChrisPatrick «s, это код, который я использовал:

SELECT 
SUM(t.Points) AS Total_Points, 
    c.Title, 
    SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT t.reason SEPARATOR '|'), '|', 5) AS Sample_Reasons 
FROM 
transactions t JOIN categories c ON (t.Category_ID=c.Category_ID) 
GROUP BY c.Category_ID 
ORDER BY c.Title ASC 
Смежные вопросы