SELECT
p.id,
p.user,
SUM(v.type * 2 - 1) AS votecount
FROM posts p
LEFT JOIN votes v ON p.id = v.postID
WHERE p.user = 'tim'
GROUP BY p.id, p.user
ORDER BY votes DESC
更新 – p和v解释.
在此查询中,p和v分别是帖子和投票的别名.别名本质上是一个替代名称,它仅在声明它的语句范围内定义(在本例中为SELECT语句).不仅表可以有别名,还有列.在此查询中,votecount是SUM(v.type * 2 – 1)表达式表示的列的别名.但目前我们只谈论桌子.
在继续关于表别名的解释之前,我将简要解释为什么你可能需要使用表名来为列名添加前缀,比如posts.id而不是id.基本上,当查询引用多个表时,就像在这种情况下一样,您可能会发现始终使用相应的表名称为列名添加前缀非常有用.这样,当您重新访问旧脚本时,您始终可以告诉哪个列属于哪个表,而无需查找引用的表的结构.此外,在省略表引用时必须包含表引用,这会导致列所属的表格不明确. (在这种情况下,引用id列而不引用posts表会产生不明确的情况,因为每个表都有自己的id.)
现在,当您在列名称之前写出完整的表名时,可能很难读取大而复杂的查询.这是(短)别名派上用场的地方:它们使查询更容易阅读和理解,虽然我已经知道并非所有人都有这种观点,所以你应该自己判断:this question包含两个版本的相同查询,一个具有长命名的表引用,另一个具有短名称的引用,以及一个意见(在对其中一个答案的评论中)为什么别名不适合.
无论如何,在这个特定查询中使用短表别名可能不如在一些更复杂的语句中那样有益.只是当查询引用多个表时,我习惯于对表进行别名.
This MySQL documentation article包含MySQL中别名表的官方语法(实际上与标准SQL中的相同).