我需要有关如何创建此SQL查询以获得最佳性能的意见,而查询构建器并不雄辩。
我有两张桌子,
Images | |->id |->id_user |->name
Users | |->id |->name |->images (BOOLEAN) (if have images)
如果users.images
为TRUE
,我需要显示包含一个图片的用户列表(第一张图片);如果users.images
为FALSE
,则需要显示默认图片。
问候和感谢!
答案 0 :(得分:0)
首先,关于改进架构的一些注意事项。 Users.images是您在加入Images.id_user时可以找到的冗余信息。我建议删除它。它只会失去同步或需要一个触发器,这将减慢插入和删除。
哪个图像是用户的“第一”图像?图像上没有排序信息。我只会选择最小的ID,但你应该明白这一点。
现在进入查询。使用LEFT OUTER JOIN获取用户中的所有元素(带图像的连接的左侧),即使它们没有图像。
使用带子选择的WHERE子句为每个用户只获取一个图像,确保为没有图片的用户负责。
要提供默认值,COALESCE将返回第一个非NULL参数。
SELECT Users.name, COALESCE(Images.id, $DEFAULT_IMAGE_ID)
FROM Users
LEFT OUTER JOIN Images
Users.id = Images.id_user
WHERE Images.id is NULL
OR Images.id = (
SELECT MIN(ID) FROM Images WHERE Users.id = Images.id_user
)
确保Images.id_user已编入索引或性能不佳。
I cribbed heavily from this answer。你也可以use GROUP BY as in this answer。
或者,您可以将图像保留为NULL并让应用程序填写默认值。应用程序层可能是决定默认用户映像应该是什么的更好的地方。