0

我正在尝试使用联接从 2 个表中获取用户详细信息和个人资料图像。问题是并非所有用户都有 prof 图像,因此我必须在 where 子句中使用 if 条件。没有 prof pic 的用户默认为 0,因为他们的 prof pic 图像 0 不属于任何人,其余的有他们的 prof pic id 例如 17 。

IE

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 的用户返回任何结果,这是问题所在。我在想条件语句可能有效,但我不知道在这种情况下如何使用它们。

4

2 回答 2

0

我想提出一个可能的替代方案,它将极大地简化并可能加快您的查询(尽管您应该像所有优化声明一样衡量这一点),您的查询。

考虑在用户加入时将默认图像分配给用户,然后简单地允许他们覆盖它。这样,每个用户都有一个图像,无论他们是否配置了一个,都可以以完全相同的方式提取该图像。

而且,除非您计划拥有数百万用户,否则空间需求不应过于繁重。

您仍然可以在表中维护一个字段来说明是否选择了真实图像,即使这在技术上可能违反 3NF。大多数人没有意识到,但如果您了解和/或减轻可能的问题,那么做这种事情(通常是为了性能或简化)是完全可以的。

于 2013-06-09T12:15:04.033 回答
0

对要从图像中检索的所有列使用子查询。不要在那里使用 join 。

 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 

虽然我不确定 IsNull(,) 的存在或其在 MySQL 中的语法。您可以为没有个人资料图片的用户设置默认图片网址。

于 2013-06-09T12:41:38.773 回答