如何比较两个SELECT查询?及修正SQL语句获取指定结果
嘿,我来帮你搞定这两个问题:
如何比较两个SELECT查询的结果?
比较两个SELECT结果的方法有好几种,根据你的需求选合适的就行:
用集合操作符快速找差异/交集:如果你的数据库支持(比如PostgreSQL、SQL Server、MySQL 8.0+),
EXCEPT和INTERSECT是最直接的方式:EXCEPT返回第一个查询有但第二个没有的记录INTERSECT返回两个查询都有的记录
示例代码:
-- 找出查询A独有的记录 SELECT id, name FROM query_a EXCEPT SELECT id, name FROM query_b; -- 找出两个查询共有的记录 SELECT id, name FROM query_a INTERSECT SELECT id, name FROM query_b;注意:两个查询的列数、数据类型必须完全匹配哦。
用JOIN定位差异:如果你的数据库不支持集合操作符,用LEFT JOIN也能实现:
-- 只在查询A存在的记录 SELECT a.* FROM (SELECT id, name FROM table_x) a LEFT JOIN (SELECT id, name FROM table_y) b ON a.id = b.id AND a.name = b.name WHERE b.id IS NULL;换成RIGHT JOIN就能找到只在查询B的记录。
先对比记录数快速验证:如果只是想确认两个结果是否完全一致,先查COUNT是否相同,再结合上面的方法深入排查:
SELECT COUNT(*) FROM query_a; SELECT COUNT(*) FROM query_b;
修复你的SQL语句以获取目标结果
先说说你原语句的问题:
- 子查询
(SELECT * FROM inscricoes WHERE email='$email')返回的是整行数据,但channel <> ...需要的是单个字段值(或一组值),用*会直接导致语法错误。 - 就算子查询返回单个列,用
<>只能匹配单个值,如果inscricoes里该用户有多个channel,这条语句会报错,应该用NOT IN或者NOT EXISTS。
假设inscricoes表包含channel字段,修改后的正确语句如下:
SELECT * FROM users WHERE email <> '$email' AND channel NOT IN ( SELECT channel FROM inscricoes WHERE email = '$email' ) ORDER BY RAND();
如果inscricoes中该用户的channel可能有NULL值,NOT IN会出现意料之外的结果,推荐用更安全的NOT EXISTS写法:
SELECT u.* FROM users u WHERE u.email <> '$email' AND NOT EXISTS ( SELECT 1 FROM inscricoes i WHERE i.email = '$email' AND i.channel = u.channel ) ORDER BY RAND();
这样修改后,就能筛选出users表中邮箱不是a@a、且channel不在该用户inscricoes记录中的用户,随机排序后就能得到你想要的d@d | ddddd这条记录啦。
内容的提问来源于stack exchange,提问作者Arsom Nolasco
相关产品推荐
相关产品推荐

