如果有图像sql,请为用户提供第一个用户图像

时间:2015-02-15 06:12:29

标签: mysql database laravel

我需要有关如何创建此SQL查询以获得最佳性能的意见,而查询构建器并不雄辩。

我有两张桌子,

Images | |->id |->id_user |->name

Users | |->id |->name |->images (BOOLEAN) (if have images)

如果users.imagesTRUE,我需要显示包含一个图片的用户列表(第一张图片);如果users.imagesFALSE,则需要显示默认图片。

问候和感谢!

1 个答案:

答案 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并让应用程序填写默认值。应用程序层可能是决定默认用户映像应该是什么的更好的地方。