代码之家  ›  专栏  ›  技术社区  ›  Faisal

mysql left join with count返回未知列

  •  0
  • Faisal  · 技术社区  · 5 年前

    亲爱的,我有下面的查询来计算每个用户的垃圾邮件数量和订单总数。

    我加入左边的是因为不是所有的订单都有垃圾邮件

    select users.firstName,users.lastName,users.Id,users.phoneNumber,count(CASE 
                                WHEN comments.`commentType` = "spam" THEN 1 ELSE NULL END) as countSpam,
                                count(`orders`.`id`) as totalOrder
                                from `orders`,users,providers
                                LEFT JOIN comments ON `orders`.`id`= `comments`.`commentableId`
                                where
                                `orders`.`providerId` = `providers`.id
                                and
                                users.id = `providers`.userId
                                and
                                `orders`.`createdAt` >= (CURDATE() - INTERVAL 7 DAY)
                                GROUP BY users.id
                                ORDER BY countSpam DESC;
    

    从MySQL获取以下错误

    “on子句”中的未知列“orders.id”

    这里的问题是什么?我根据旧的查询做了正确的左联接,工作正常

    1 回复  |  直到 5 年前
        1
  •  0
  •   Faisal    5 年前

    我解决了这个问题,我认为这是语法问题,下面是一个像符咒一样工作的新查询

    select users.firstName,users.lastName,users.phoneNumber,count(CASE
                                WHEN comments.`commentType` = "spam" THEN 1 ELSE NULL END) as spamCounter,
                                ROUND(count(CASE
                      WHEN comments.`commentType` = "spam" THEN 1 ELSE NULL END)/count(orders.id),2) AS ratio_spam,
                                count(orders.id) as totalOrder
                                from users,providers,orders
                                LEFT JOIN comments ON `orders`.`id`= `comments`.`commentableId`
                                where
                                orders.`providerId` = providers.id
                                and
                                users.id = providers.userId
                                and
                                `orders`.`createdAt` >= (CURDATE() - INTERVAL 7 DAY)
                                GROUP BY users.id
                                ORDER BY spamCounter DESC
                                LIMIT 20;