MySQL: группировка по предложению - PullRequest
2 голосов
/ 18 августа 2011

Мне нужна помощь с предложением группы по запросу mysql.

Таблица медалей (содержит все медали) :

+-----------------------------------------------------------------------+
| medal_id | medal_level | medal_name      | medal_type | medal_icon    |
|-----------------------------------------------------------------------|
|        1 |           1 |    1 post medal |          1 | icon_file.png |
|        2 |           2 |  1 thread medal |          2 | icon_file.png |
|        3 |           1 |    2 post medal |          1 | icon_file.png |
|        4 |           2 | 2 threads medal |          2 | icon_file.png |
+-----------------------------------------------------------------------+

Таблица медалей пользователей (содержит медали, завоеванные пользователями) :

+--------------------------------+
|medal_id |user_id | earnedtime  |
|--------------------------------|
|       1 |      1 | 1313548360  |
|       2 |      1 | 1313548365  |
|       3 |      1 | 1313548382  |
|       4 |      1 | 1313548410  |
+--------------------------------+

MySQL Query:

SELECT m.*, u.*
FROM users_medals u
LEFT JOIN medals m ON (u.medal_id=m.medal_id)
WHERE u.user_id IN(1)
GROUP BY m.medal_type
ORDER BY u.earnedtime

Для этого предназначены показ медалей, заработанных пользователями (это плагин для системы досок объявлений). Он выбирает и отображает медали, где идентификатор медали пользователя равен идентификатору медали в таблице, содержащей все медали.

Это прекрасно работает, однако, не отображает последнюю медаль. Отображаются только следующие идентификаторы медалей: 1, 2. Должны отображаться 3 и 4.

Дополнительная информация: Я хочу отображать только одну медаль из каждого типа медалей. Так, например, если пользователь заработал две «почтовые медали», будет отображаться только самая последняя заработанная медаль вместе с другими заработанными медалями.

Любая помощь будет принята с благодарностью.

Ответы [ 5 ]

1 голос
/ 18 августа 2011
SELECT m.*, u.*
  FROM users_medals u
  LEFT JOIN medals m ON u.medal_id = m.medal_id
  WHERE u.user_id IN (1)
  AND u.earnedtime = (
    SELECT MAX(users_medals.earnedtime) FROM users_medals
    LEFT JOIN medals ON users_medals.medal_id = medals.medal_id
    WHERE users_medals.user_id = u.user_id
    AND medals.medal_type = m.medal_type
  )

Я думаю, что это тоже можно сделать как вспомогательное соединение, но ограничение типа медали в другом столе вызвало у меня головную боль. Вероятно, было бы легче написать, если бы были две таблицы, объединенные вместе.

0 голосов
/ 18 августа 2011

Дален правильно спросил - зачем вам в первую очередь использовать GROUP BY? Это не нужно в этом запросе. GROUP BY служит другой цели; может быть, вы можете понять это больше, проверив пример типа этот .

0 голосов
/ 18 августа 2011

Это не показывает 3 и 4, потому что вы группируете его по типу медали. Таким образом, 3 и 4 и тот же тип, что и 1 и 2. Если вы снимаете группу, она будет показывать каждую медаль.

Если вы хотите эту группу, но хотите только 3 и 4. Тогда вам просто нужно

order by m.medal_type descending
0 голосов
/ 18 августа 2011

Поскольку вы группируете по типу медали, он будет выбирать только один из каждого типа. Если вам нужен список всех медалей, которые получил пользователь, почему вы группируете по типу медали?

Возможно, вы ищете самый высокий уровень медали по типу? Если это так, вы можете указать это.

0 голосов
/ 18 августа 2011

У вас есть "GROUP BY medal_type". Поскольку ваша таблица медалей имеет значения 1,2 для этого столбца, вы не получите 3 и 4 в ваших результатах.

...