MySQL - Group By, Max, Inner Join - выпуск - PullRequest
       25

MySQL - Group By, Max, Inner Join - выпуск

1 голос
/ 21 сентября 2011

Возникли проблемы с SQL в MySQL. Не уверен, что правильным было вернуть все награды моих пользователей , выигравших ... но только самый высокий AwardLevel из премии они победили. Корабль отношения выглядит следующим образом:

A Пользователь может выиграть много AwardLevel (s) . Каждый AwardLevel привязан к категории, называемой Award . AwardLevels имеют уровень сложности (1, 2 или 3) Это похоже на значки Stackoverflow, проходящие через награды типа «бронза», «серебро» и «золото».

Я пытаюсь вернуть все награды для пользователя, но отфильтрован до максимального (сложность) рейтинга. Например, чтобы пользователь достиг уровня 3 (сложность = 3), он должен сначала заработать сложность = 1, а затем сложность = 2. Я не хочу показывать все три уровня с моим запросом только самого высокого (MAX). Проблема с моим текущим запросом заключается в том, что GROUP BY, похоже, захватывает первую найденную запись для получения награды. Который иногда не тот, с трудностью = 3. Не уверен, должен ли я поместить выражение MAX где-то еще в запросе.

ОБНОВЛЕННЫЙ ЗАПРОС :

SELECT a.*, MAX(awlev.difficulty)
FROM Award AS a
    INNER JOIN AwardLevel AS awlev ON awlev.id = a.level_id
WHERE a.user_id = 3 -- just a sample user_id
GROUP BY awlev.category_id

НАСТРОЙКА СТОЛА : - Примечание: я забыл таблицу, относящуюся к пользователям. - чтобы выиграть AwardLevels в этой настройке таблицы, я называю это UserAwardLevels

CREATE TABLE Users (
     id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
     fullname VARCHAR(100)
);

CREATE TABLE AwardLevels (
     id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
     levelname VARCHAR(100),
     difficulty INT
);

CREATE TABLE Awards (
     id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
     awardname VARCHAR(100)         
);

CREATE TABLE UserAwardLevels (
  user_id INT,
  awardlevel_id INT
);

CREATE TABLE AwardLevels (
     id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
     levelname VARCHAR(100),
     difficulty INT
);

1 Ответ

1 голос
/ 21 сентября 2011

Если я понимаю, что вы хотите, в Mysql это немного неуклюже, потому что функции управления окнами недоступны. Тем не менее, вы можете попробовать

SELECT a.* /* put desired columns in */
FROM AwardLevel as awlev JOIN Award AS a
ON awlev2.id = a2.level_id
JOIN
  SELECT (a2.user_id, MAX(awlev2.difficulty) AS maxdifficulty
     FROM Award AS a2 INNER JOIN AwardLevel2 AS awlev2 ON awlev2.id = a2.level_id
     GROUP BY a2.user_id, awlev2.category_id) AS subquery
ON a.user_id = subquery.user_id AND awlev.difficulty = maxdifficulty
WHERE a.user_id = 999; /* whatever id */

Оптимизатор, вероятно, улучшит это, и я не уверен, что объединение awlev и a необходимо без просмотра схемы.

...