Как исключить результаты запроса SQL и получить только определенную неповторяющуюся информацию? - PullRequest
0 голосов
/ 16 мая 2019

Вот предложение:

Tables relationship

У меня есть эти таблицы, предназначенные для создания приложений в стиле Steam (загрузка игр, общение с друзьями и т. Д.).Моя проблема возникает, когда я хочу узнать, кто из моих друзей играет в каждую из моих игр (скажем, я играю в Minecraft, я бы хотел посмотреть, кто из моих друзей тоже играет в Minecraft), и я изо всех сил пытаюсь сформировать запрос, который скажетмне это.Я думал, что это может быть сделано с помощью клавиши EXCEPT, но я пытался безрезультатно.

Может быть, это поможет понять, что я хочу получить:

Query results

Как видите, у меня есть Crashex Legends общего с Migue , а также Crashex Legends и Overwatch с Test .Я хочу видеть только один результат на каждого друга в обычной игре, чтобы я мог видеть только результаты 1, 8 и 9.

Ответы [ 3 ]

1 голос
/ 16 мая 2019

Хорошо, попробуйте использовать CTE, чтобы помочь концептуализировать его и разбить на маленькие кусочки. Я бы сначала создал столбцы идентификаторов для ваших первичных ключей. Если вы не ссылаетесь на идентификаторы, использование реляционной базы данных не имеет смысла. Но, может быть, как-то так. Вы не должны использовать CTE, но я думаю, что это помогает сделать это шаг за шагом. Трюк, который вы действительно ищете, находится в MyFriendsThatPlayMyGames_CTE. Здесь вы делаете левое соединение, а затем захватываете все, что не является нулевым, что означает совпадение. Измените на null, чтобы получать игры, в которых у ваших друзей нет, и т. Д.

with
MyFriends_CTE (me, friend)as(

    Select user1, user2
    from userFriends
    where user1 = @ME

    UNION

    Select user2, user1
    from userFriends
    where user2 = @Me
),

MyGames_CTE as (

 blah blah
),

MyFriendsGames_CTE as (

 select
from myfriends_cte
join games
),

MyFriendsThatPlayMyGames_CTE as(

select
from MyfriendsGames_CTE
left join myGames_CTE
on blah blah
where myGames_CTE.name is not null


)

select 
from MyFriendsThatPlayMyGames_CTE
0 голосов
/ 16 мая 2019

Что-то вроде приведенного ниже кода должно получить вам данные, которые вы ищете. Не рекомендуется использовать 'select *'; вместо этого явно объявите, какие столбцы вам нужно вернуть. Тем не менее, я не понимаю, что вы используете лучшие практики, так как рассмотрение вашего дизайна БД эквивалентно тому, как вы слышите гвозди на доске; суррогатные ключи, третья нормальная форма, ограничения внешних ключей и т. д.

SELECT 
   US.nickname, UG.game, MG.[user], MG.game
FROM UserFriends AS UF
JOIN Users AS US ON (UF.user1 = US.nickname OR UF.user2 = US.nickname) AND US.nickname <> 'Penny'
JOIN UserGames AS UG ON US.nickname = UG.[user]
JOIN UserGames AS MG ON UG.game = MG.game
WHERE 'Penny' IN (UF.user1, UF.user2)
AND MG.[user] = 'Penny'
0 голосов
/ 16 мая 2019

Вам необходимо присоединиться к UserGames дважды, а не один раз с ИЛИ.

ПРИСОЕДИНЯЙТЕСЬ один раз с User1 и псевдонимом UserGames как UG1; Затем снова ПРИСОЕДИНЯЙТЕСЬ с User2 и псевдонимом UserGames как UG2.

Затем в предложении WHERE найдите строки, в которых UG1.Game = UG2.Game

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