我正在尝试使用连接从2个表中获取用户详细信息和配置文件图像。问题是并非所有用户都有prof图像因此我必须在where子句中使用if条件。没有教授照片的用户默认为0,因为他们的教授照片图像0不属于任何人,其余人有他们的教学照片ID 例如17。
即
if tb1.user_pic > 0 Then
choose their profile image
else
choose a default image.
SELECT tb1.user_id , tb1.full_names , tb1.user_email , tb1.user_pic , tb1.userName ,
tb2.img_id , tb2.img_format , tb2.img_by , tb2.img_album
FROM users as tb1
LEFT JOIN images as tb2
ON tb2.img_by = tb1.user_id
WHERE tb1.user_id = '$session_id' && tb2.img_id = tb1.user_pic
ORDER BY tb1.user_id
上述查询将为没有prof pic的用户返回没有结果的问题。我认为条件语句可能有用但我不知道在这种情况下如何使用它们。
答案 0 :(得分:0)
我想建议一个可能的替代方案,它会极大地简化,并且可能会加速(尽管你应该像所有优化声明一样衡量),查询。
考虑在用户加入时为用户分配默认图像,然后只允许他们覆盖它。这样,每个用户都有一个可以完全相同的方式提取的图像,无论他们是否配置了一个。
而且,除非您为数百万用户进行规划,否则空间要求不会太繁重。
您仍然可以在表格中维护一个字段,以说明是否已选择真实图像,即使技术上可能违反3NF。大多数人都没有意识到,但只要你理解和/或减轻可能出现的问题,做这种事情(通常用于表现或简化)是很好的。
答案 1 :(得分:0)
对要从图像中检索的所有列使用子查询。不要在那里使用加入。
SELECT tb1.user_id, tb1.full_names, tb1.user_email, tb1.user_pic, tb1.userName,
IsNull((select tb2.img_id from images tb2 where tb2.img_id = tb1.user_pic and tb2.img_by = tb1.user_id), 0) AS img_id,
IsNull((select tb2.img_format from images tb2 where tb2.img_id = tb1.user_pic and tb2.img_by = tb1.user_id), 'jpg') AS img_format,
IsNull((select tb2.tb2.img_album from images tb2 where tb2.img_id = tb1.user_pic and tb2.img_by = tb1.user_id), 'default') AS img_album
FROM users as tb1
WHERE tb1.user_id = '$session_id'
ORDER BY tb1.user_id
虽然我不确定在MySQL中是否存在IsNull(,)或其语法。您可以为没有个人资料照片的用户设置默认图片网址。