SQL语句如何在两张表中分组查询,而只取一条记录?

那天我在一家咖啡厅,旁边的那个家伙对着电脑屏幕抓耳挠腮,手里拿着一张写着 SQL 语句的纸。
他问我为什么在一个大表中,每个用户只取最高分的记录。
我看了一眼他的论文,心想,嘿,这有点像我在图书馆整理书架时遇到的情况——只保留了每个作者最新的一本书。

他的 SQL 写得很好。
内部查询使用 GROUP BY userID 来分隔用户,然后使用 MAX(rank) 查找每个用户的最大排名。
在外部查询中,WHERE userid +rank IN (...) 就像我在书店中按书脊编号搜索书籍一样,我确保选择每组中编号最高的一本。
你看,userid + max(rank) 的组合就像给每本书一个唯一的标签,以防止同一作者的书混淆。

但我突然想到,如果两个用户的评分相同怎么办?例如,如果小明和小红都排在第一,那么这条SQL会选择谁呢?是基于更新时间还是随机样本?等等,我查一下……啊,原来默认是按照第一条记录的。
这很公平,就像图书馆的书架一样,先到先得。
但是如果您希望系统随机选择一个怎么办?我可以将 ORDER BY RAND() 添加到外部查询吗?
看起来他还在写代码。
我在想,如果表中有几万条记录,这个查询会不会很慢?不,数据库优化器必须有办法添加分组和聚合功能。
但如果用户 id 和排名列没有索引...tsk,可能需要等待一段时间。
就像我去超市找打折商品一样,如果货架乱七八糟,我就得打断腿。

sql语句:一个表和另外两个表的关联语句?

两条 SQL 语句拼写错误并且都不正确。

第一: sql 从 a.bid=b.id 上的内连接 b 中选择 a.cid=c.id 上的内连接 c
或者 sql 从 a、b、c 中选择,其中 a.bid=b.id 且 a.cid=c.id
第二: 写作风格完全错误,语法混乱。

废话别再写了,重新学学SQL吧。

如何查询关联表中满足特定条件的两组数据?

这两个 SQL 查询执行不同的操作。
我们先来说第一组:
我们直接进入SQL:SELECT a。
FROM a LEFT JOIN b ON b.id = a.outer_id WHERE b.id IS NULL OR (b.id NOT NULL AND b.type != 9 9 );
这意味着您需要从表 A 中查找与表 B 不相关的记录,或者相关但类型不是 9 9 的记录。
如何实现?使用LEFT JOIN存储A表的记录,然后使用WHERE子句进行过滤。
要么B表没有对应的记录,要么有记录,但类型不是9 9
第二组就简单多了:
我们直接上SQL:SELECT a。
FROM a INNER JOIN b ON b.id = a.outer_id AND b.type = 9 9 ;
此 SQL 的作用是从表 A 中查找与表 B 关联且类型为 9 9 的记录。
INNER JOIN 确保仅保留符合条件的记录。
B表中的id必须与A表的外部id匹配,且类型必须为9 9
要点:
在第一组中使用 LEFT JOIN 和 IS NULL 或条件过滤。

第二组使用INNER JOIN,条件直接写在ON子句中。

为了优化,可以给B表的id、type列添加复合索引,也可以考虑给A表的external_id列添加索引,查询前检查数据。
例如,首先检查第二组中是否有类型为 9 9 的记录。

要扩展条件,例如,如果要查找第一组中的状态也为 1 ,请添加 AND a.status = 1 ;处于 WHERE 状态。

你自己看看,这两条SQL应该可以解决问题。