SQL:LEFT JOIN和别名不能一起工作

时间:2017-05-19 17:08:03

标签: mysql select mysqli left-join

$query = "SELECT a.comment_user_id as main_id, a.comment_date as timestamp, a.comment_content as content, a.comment_link_id as link_unique, a.comment_id as status, NULL as url, b.user_login as ulogin, b.user_avatar_source as uavatar, c.link_title as ltitle, NULL as desc FROM kliqqi_comments as a WHERE comment_user_id IN ('$following2')  
        LEFT JOIN kliqqi_users as b ON a.comment_user_id = b.user_id  
        LEFT JOIN kliqqi_links as c ON a.comment_user_id = c.link_author  
    ORDER BY timestamp DESC LIMIT 10";  

$result = mysqli_query($db_conx, $query);
$row = $result->fetch_array(MYSQLI_ASSOC);

有人可以告诉我代码有什么问题吗?它总是返回此错误:

  

致命错误:在布尔值

上调用成员函数fetch_assoc()

布尔意味着由于$ query变量中的一些错误而无法执行此查询,我无法弄清楚。

$ following是一个数组。 kliqqi_comments别名a,kliqqi_users别名b,kliqqi_links别名c。我也将所有其他字段存储为别名。没有拼写错误或任何其他愚蠢的错误。我已经彻底检查过了。

更新 我正在更新这个帖子,因为我的查询实际上有很多部分,许多用户可能会发现它有用。

$query = "SELECT a.comment_user_id as main_id, a.comment_date as timestamp2, a.comment_content as content, a.comment_link_id as link_unique, a.comment_id as status, b.user_login as ulogin, b.user_avatar_source as uavatar, c.link_title as ltitle FROM kliqqi_comments a
                LEFT JOIN kliqqi_users b ON a.comment_user_id = b.user_id
                LEFT JOIN kliqqi_links c ON a.comment_link_id = c.link_id
                WHERE comment_user_id IN ('$following')
                UNION ALL
              SELECT d.link_author as main_id, d.link_date as timestamp2, d.link_status as content, d.link_id as link_unique, NULL as status, e.user_login as ulogin, e.user_avatar_source as uavatar, d.link_title as ltitle FROM kliqqi_links d
                LEFT JOIN kliqqi_users e ON d.link_author = e.user_id
                WHERE link_author IN ('$following') AND link_status IN ('new','published')
                UNION ALL
              SELECT f.vote_user_id as main_id, f.vote_date as timestamp2, f.vote_value as content, f.vote_link_id as link_unique, NULL as status, g.user_login as ulogin, g.user_avatar_source as uavatar, h.link_title as ltitle FROM kliqqi_votes f
                LEFT JOIN kliqqi_users g ON f.vote_user_id = g.user_id
                LEFT JOIN kliqqi_links h ON f.vote_link_id = h.link_id
                WHERE vote_user_id IN ('$following')
              ORDER BY timestamp2 DESC LIMIT 30";

它做了什么?

我有3张桌子:kliqqi_links,kliqqi_users,kliqqi_votes

  

UNION ALL

所有这些都有一个时间戳字段。 我想从这3个表中获取内容,并按时间戳的降序排列。为此,我使用了UNION ALL(UNION也可以在这里使用,但是UNION必须运行重复的检查,所以如果可以的话,最好避免它。)。但UNION ALL仅在所有表具有相同数量的字段时才起作用。所以,我创建了NULL元素来等同数字。 应注意,对于组合各个字段没有数据类型的限制。但由于我不得不使用时间戳来表示序列,所以我将它们保持在一起。

  

别名

由于所有相应的字段在不同的表中都有不同的名称,因此我使用别名来避免混淆。如果没有别名,结果将存储在第一个SELECT语句中提到的字段中,这将是一个混乱。

  

多个LEFT JOIN

现在,我想从每个SELECT查询的其他表中获取一些数据。 例如对于 kliqqi_comments (第一个SELECT语句),我想从 kliqqi_users 中获取发表评论的人的用户数据加上我想获取此评论的链接 kliqqi_links 表。所以,我在 kliqqi_comments 查询中使用了左连接,其中来自 kliqqi_comments comment_user_id 等于来自 kliqqi_users <的 user_id 来自 kliqqi_comments kliqqi_comments link_id 来自 kliqqi_links comment_link_id 。 请注意,我设法将UNION ALL的所有3个语句中的字段等同。

  

在哪里

$ following是逗号分隔数组,以确保它返回人们用户所关注的结果。

  

ORDER BY DESC,LIMIT

按时间戳和LIMIT输出结果排序。

那就是它。

1 个答案:

答案 0 :(得分:3)

where条款应该在<{strong> join条款之后来,而不是在它们之前。此外,desctimestamp是保留字。如果您绝对必须将它们用作列别名,则需要转义它们:

SELECT    a.comment_user_id as main_id, 
          a.comment_date as `timestamp`, -- Notice the escaping
          a.comment_content as content,
          a.comment_link_id as link_unique,
          a.comment_id as status,
          NULL as url,
          b.user_login as ulogin,
          b.user_avatar_source as uavatar,
          c.link_title as ltitle,
          NULL as `desc` -- Notice the escaping 
FROM      kliqqi_comments as a 
LEFT JOIN kliqqi_users as b ON a.comment_user_id = b.user_id  
LEFT JOIN kliqqi_links as c ON a.comment_user_id = c.link_author  
WHERE     comment_user_id IN ('$following2') -- Where clause after the joins
ORDER BY  `timestamp` DESC LIMIT 10";