我有两个表:
$email = a@a
SELECT * FROM users WHERE email<>'$email' AND channel <> '( SELECT * FROM inscricoes WHERE email ='$email')' ORDER BY RAND();
如何得到这个结果?
d@d | ddddd
最佳答案
我会使用反连接模式
SELECT u.email
, u.channel
FROM users u
-- anti-join, exclude rows with matching channel
LEFT
JOIN inscricoes i
ON i.email = 'a@a'
AND i.channel = u.channel
WHERE i.email IS NULL
AND u.email <> 'a@a'
ORDER BY u.channel
就是说,从 users
获取所有行(user = 'a@a' 的行除外)
连同这些行,从 inscricoes
中获取任何匹配的行。
扭曲是 WHERE
子句中的条件。
我们保证任何具有匹配项的行都将具有 i.channel
的非 NULL 值(因为 NULL 值不满足 ON 子句中的相等条件)。因此,如果我们排除 i.channel
中具有非 NULL 值的行,我们将留下没有匹配项的行。
可以使用 NOT EXISTS(相关子查询)
模式获得等效结果
SELECT u.email
, u.channel
FROM users u
WHERE u.email <> 'a@a'
AND NOT EXISTS
( SELECT 1
FROM inscricoes i
WHERE i.email = 'a@a'
AND i.channel = u.channel
)
ORDER BY u.channel
关于php - 如何比较两个选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49618615/