在文章Why Arel?,笔者提出了这个问题:查询之间的细微差别?
假设我们有一个用户表和照片表,我们要选择的所有用户数据和他们所创建的照片的*算* 。
他提出的解决方案(添加了一个换行符)是
SELECT users.*, photos_aggregation.cnt
FROM users
LEFT OUTER JOIN (SELECT user_id, count(*) as cnt FROM photos GROUP BY user_id)
AS photos_aggregation
ON photos_aggregation.user_id = users.id
当我试图写这样的查询,我想出了
select users.*, if(count(photos.id) = 0, null, count(photos.id)) as cnt
from users
left join photos on photos.user_id = users.id
group by users.id
(该if()
在列列表只是为了使其在用户没有照片时表现相同)。
文章的作者接着说
只有高级SQL程序员知道如何写这个(我经常问在面试这个问题,我从来没有见过一次有人得到它的权利)。而且它不应该很难!
我不认为自己是一个“高级SQL程序员”,所以我假设我错过了一些微妙的东西。我错过了什么?
这里的[一些测试数据(https://gist.github.com/5dee7db1088287f7c5a9)如果你想玩耍。 – Snowball