MySQL Query 2 Таблицы левого соединения - PullRequest
0 голосов
/ 30 марта 2019

У меня есть 2 таблицы - Пользователь и Результат

ID | UserID | League
1  | 123    | Great
2  | 124    | Great  
3  | 125    | Great  
4  | 123    | Ultra  
5  | 124    | Ultra  
6  | 126    | Ultra  

ID | Winner | Loser | League
1  | 124    | 123   | Great
2  | 124    | 123   | Ultra
3  | 124    | 125   | Great

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

Так что, если бы я сделал это для 126 Ultra, он должен вернуться - 123,124 И для 123 Великого - 125

Пока у меня есть

SELECT DISTINCT UserID FROM `User` t1 LEFT JOIN `Result` t2 ON (t1.UserID = t2.Winner OR t1.UserID = t2.Loser) WHERE UserID != 125 AND t1.League = 'Ultra' AND t2.id IS NULL

Я не уверен, что мне не хватает, любая помощь будет оценена.

1 Ответ

1 голос
/ 30 марта 2019

Чтобы получить желаемые результаты, вам нужно получить список всех пользователей в лиге интересов (исключая пользователя, по которому вы ведете поиск), а затем LEFT JOIN этого в таблице Result, выбирая только строки без соответствующего результата. После этого вы получите список пользователей, которых конкретный пользователь не играл в этой лиге. В MariaDB 10.3 это можно сделать с помощью CTE (этот пример для пользователя 123 Great):

WITH Users AS
  (SELECT DISTINCT UserID 
   FROM User
   WHERE League = 'Great' AND UserID != 123)
SELECT UserID
FROM Users u
LEFT JOIN Result r ON r.League = 'Great'
                  AND ((r.Winner = u.UserID AND r.Loser = 123)
                    OR (r.Winner = 123 AND r.Loser = u.UserID)
                      )
WHERE r.ID IS NULL

Выход:

UserID
125

Демонстрация (включая результаты для 126 Ultra) на dbfiddle

...