Использование левого соединения с несколькими условиями SQL - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь создать приложение, которое будет отображать всех остальных пользователей, которые не являются вошедшими в систему пользователями или которые не вошли в систему вошедшими в систему пользователями (например, страница исследования), но у меня возникают проблемы при написании SQL-запроса.

Мои таблицы настроены как:

following(username1, username2)

(имеется в виду username1 следует за username2)

и

users(username, fullname, ...)

Сейчас я пытаюсьсделать что-то вроде:

SELECT * FROM
users u 
LEFT JOIN following f ON (
  u.username != 'loggedInUser'
  AND f.username1 = 'loggedInUser'
  AND f.username2 = u.username
)

Я заменяю loggedInUser в скрипте Python.

К сожалению, этот запрос в настоящее время возвращает всех моих пользователей, и это не должно быть.У меня много проблем, хотя эта логика по какой-то причине работает, у кого-нибудь есть понимание?

Ответы [ 4 ]

0 голосов
/ 30 января 2019

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

Выбрать * из пользователей, где loggedIn = 1

, который вернет вам все данные пользователей с зарегистрированным статусом

0 голосов
/ 30 января 2019
SELECT * FROM
users u 
LEFT JOIN following f ON u.[insert_primary_key_here]=f.[insert_foreign_key_here] 
WHERE u.username != 'loggedInUser'
AND f.username1 = 'loggedInUser'
AND f.username2 = u.username
0 голосов
/ 30 января 2019

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

SELECT * FROM
users u 
where u.username in(select username2 from following where username1!= 'loggedInUser')
and u.username!='loggedInUser'
0 голосов
/ 30 января 2019

Это будет отображать всех остальных пользователей, которые не являются logged in user и (не или), которых logged in user не следует (им):

SELECT * 
FROM users u 
WHERE u.username <> 'loggedInUser'
    AND NOT EXISTS (
            SELECT 1
            FROM following f
            WHERE f.username1 = 'loggedInUser'
                AND f.username2 = u.username
        );

Ваш запрос может измениться на INNER JOIN, чтобы получить ожидаемый результат, но это может быть сложнее с худшей производительностью:

SELECT DISTINCT u.* 
FROM users u 
INNER JOIN following f 
ON f.username1 <> 'loggedInUser'
    OR f.username2 <> u.username
WHERE u.username <> 'loggedInUser';
...