Передача переменных подзапроса MySQL - PullRequest
1 голос
/ 23 апреля 2011

таблица: пользователь (id INT, имя VARCHAR)

таблица: черный список (id INT, userid INT, block_userid INT)

SELECT user.id theID, user.firstname
FROM user
WHERE
NOT user.id = 1000
AND IF ((SELECT id FROM blocklist WHERE theID = ANY (SELECT blocked_userid FROM blocklist WHERE userid = 1000)), 0, (IF ((1000 = ANY (SELECT userid FROM blocklist WHERE blocked_userid = theID)),0,1)))

Я хочу вернуть список всех пользователей, а не текущего пользователя, скажем ... пользователя 1000, который не заблокирован этим пользователем или которого нет в черном списке другого пользователя. Таким образом, это двусторонняя система ... вы не можете видеть людей, которых вы заблокировали, и вы можете видеть людей, которые заблокировали вас. Проблема в том, что я не очень хорошо могу использовать "theID" в подзапросе. Каков наилучший способ справиться с этим?

1 Ответ

0 голосов
/ 27 апреля 2011

Хорошо, на основании данных примера, я думаю, что это делает это:

SELECT u.id, u.firstname, b1.id, b2.id
FROM user AS u
JOIN user myUser ON myUser.id = 2
LEFT JOIN blocklist b1 ON u.id = b1.userid AND b1.blocked_userid = myUser.id
LEFT JOIN blocklist b2 ON u.id = b2.blocked_userid AND b2.userid = myUser.id
WHERE u.id != myUser.id
HAVING b1.id IS NULL AND b2.id IS NULL

Если вам действительно нужно избавиться от двух дополнительных столбцов b1.id и b2.id:

SELECT t.theId, t.firstname FROM
       (SELECT u.id as theID, u.firstname, b1.id as b1, b2.id as b2
       FROM user AS u
       JOIN user myUser ON myUser.id = 2
       LEFT JOIN blocklist b1 ON u.id = b1.userid AND b1.blocked_userid = myUser.id
       LEFT JOIN blocklist b2 ON u.id = b2.blocked_userid AND b2.userid = myUser.id
       WHERE u.id != myUser.id
HAVING b1.id IS NULL AND b2.id IS NULL) as t
...