【问题标题】:SELECT query case causing an issueSELECT 查询案例导致问题
【发布时间】:2017-04-06 10:19:10
【问题描述】:

我有以下查询,除了一件事外,它工作得很好。它检查配置文件图像是否不在所选用户的profile_img 数据库中,如果没有,它会提供默认图像。再说一次,这很好。我的问题是,如果用户没有个人资料 img,那么由于某种原因我无法访问他们的 user_id。不过,他们的用户名是正确的。但是,如果用户确实有 profile_img,那么链接 echo '<a href="profile?user='.$comment_user_id.'"> 就可以正常工作。

任何人都知道如何在没有 profile_img 的情况下让它为用户工作?

    SELECT c. *, PI.user_id, case when p.img <> '' and p.img is not null then p.img else 'profile_images/default.jpg' end img
    FROM home_comments AS c
    LEFT JOIN (SELECT max(id) as id, user_id 
                FROM profile_img 
                GROUP BY user_id) PI
    on PI.user_id = c.user_id
    LEFT JOIN profile_img p
        on PI.user_id = p.user_id
         and PI.id = p.id
    ORDER BY c.id DESC

我试图调用它的代码

$comment_user_id = $comment_row['user_id'];
$comment_username = $comment_row['username'];
echo '<a href="profile?user='.$comment_user_id.'"><div class="comment-post-username">'.$comment_username. '</div></a>';

数据库表

home_comments
CREATE TABLE `home_comments` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `user_id` int(11) NOT NULL,
 `username` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
 `comment` text COLLATE utf8_unicode_ci NOT NULL,
 `date` datetime NOT NULL,
 PRIMARY KEY (`id`)
) 

profile_img
CREATE TABLE `profile_img` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `user_id` int(11) NOT NULL,
 `img` text COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (`id`)
)

【问题讨论】:

    标签: php mysql sql hyperlink case


    【解决方案1】:

    您正在使用 PI.user_id 获取用户 ID,但这是从左连接到图像的字段,因此它将为空。

    改用 home_cmets 中的 user_id。

    如果您只是取出 PI,那么 C 中的通配符应该可以使用或使用字段名称列表(总是更好。

    SELECT C.user_id,   -- or C.*, 
           case when p.img <> '' then p.img else 'profile_images/default.jpg' end img
    FROM home_comments AS c
    LEFT JOIN (
        SELECT max(id) as id, user_id 
        FROM profile_img 
        GROUP BY user_id
    ) PI on PI.user_id = c.user_id
    LEFT JOIN profile_img p on PI.user_id = p.user_id and PI.id = p.id
    ORDER BY c.id DESC
    

    测试 2

    SELECT C.*, 
           case when p.img <> '' and p.img is not null then p.img else 'profile_images/default.jpg' end img
    FROM home_comments AS c
    LEFT JOIN (
        SELECT max(id) as id, user_id 
        FROM profile_img 
        GROUP BY user_id
    ) PI on PI.user_id = c.user_id
    LEFT JOIN profile_img p on PI.user_id = p.user_id and PI.id = p.id
    ORDER BY c.id DESC
    

    【讨论】:

    • 试过这个,它阻止了很多查询工作。
    • 实际上,很多查询仍在显示,但它抛出未定义的索引,即使变量仍在工作。但是,指向 non-profile_img 用户的链接仍然没有获取 user_id。我还将SELECT C.user_id, 更改为SELECT c.user_id
    • 我不确定如何将其编码到案例中,但它不会像SELECT c.*, PI.user_id, (case when p.img &lt;&gt; '' then p.img else 'profile_images/default.jpg' AND p.user_id else c.user_id end) as img
    • 去掉PI.user_id,因为user_id会包含在c.*中。
    • @Hogan 我尝试了一个新案例...(case when p.user_id &lt;&gt; '' then p.user_id else c.user_id end) as PI.user_id`` 但它并没有给我我正在寻找的结果。有什么想法吗?
    【解决方案2】:

    我认为这就足够了:

    SELECT c.*, PI.user_id,
           (case when p.img <> '' then p.img else 'profile_images/default.jpg'
            end) as img
    

    请记住,NULL 几乎无法进行任何比较,包括 &lt;&gt;

    【讨论】:

    • 这仍在生成其他图像,但仍然没有为非 profile_img 用户获取 user_id。
    • 我不确定如何将其编码到案例中,但它不会像SELECT c.*, PI.user_id, (case when p.img &lt;&gt; '' then p.img else 'profile_images/default.jpg' AND p.user_id else c.user_id end) as img
    • 我尝试了一个新案例...(case when p.user_id &lt;&gt; '' then p.user_id else c.user_id end) as PI.user_id`` 但它并没有给我想要的结果。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    相关资源
    最近更新 更多