Примените разные независимые фильтры к одному и тому же столбцу в GROUP BY - PullRequest
1 голос
/ 21 января 2020

У меня есть 2 таблицы, players и stats.

Таблица players имеет id и name, а таблица stats выглядит следующим образом:

id  | Player    | Stat           | Value
1   | 0000001   | Wins           |     5
2   | 0000001   | Loses          |     6
3   | 0000001   | Jumps          |   156
4   | 0000001   | Shots          |   580
5   | 0000002   | Wins           |    15
6   | 0000002   | Loses          |     2
7   | 0000002   | Jumps          |   530
8   | 0000002   | Shots          |  1704

Я хочу отфильтровать игроков, которые соответствуют нескольким условиям, например, игроков, у которых более 5 побед, но менее 200 прыжков.

Я пробовал это

SELECT players.name
FROM players
LEFT JOIN stats
  ON stats.player = players.id
WHERE (stats.stat = "Wins" AND stats.value > 5)
  AND (stats.stat = "Jumps" AND stats.value < 200)
GROUP BY players.id

Но ничего не возвращается, потому что GROUP BY идет после WHERE. Я также попытался использовать OR.

SELECT players.name
FROM players
LEFT JOIN stats
  ON stats.player = players.id
WHERE (stats.stat = "Wins" AND stats.value > 5)
   OR (stats.stat = "Jumps" AND stats.value < 200)
GROUP BY players.id

Но в этом случае он возвращает игроков, которые соответствуют любому из условий, и мне нужны только те, которые соответствуют обоим условиям. В этом конкретном примере c он должен вернуть игрока только с id 0000001.

Я знаю, что мог бы сделать это с другим LEFT JOIN для каждой другой характеристики, но правда - это факт таблица огромна и имеет множество различных характеристик, поэтому я не думаю, что это вариант, потому что он будет очень медленным.

1 Ответ

2 голосов
/ 21 января 2020

Нет необходимости агрегировать. Это можно сделать с помощью двух внутренних объединений, по одному на условие:

SELECT p.name
FROM player p
INNER JOIN stats s1 ON s1.player = p.id AND s1.stat = 'Wins' AND s1.value > 5
INNER JOIN stats s2 ON s2.player = p.id AND s2.stat = 'Jumps' AND s2.value < 200

При индексе stats(player, stat, value) это должно быть эффективным вариантом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...