首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从表左联接中获取列?

如何从表左联接中获取列?
EN

Stack Overflow用户
提问于 2014-01-08 14:36:21
回答 2查看 45关注 0票数 1

SqlFidle在这里。

Mysql查询:

代码语言:javascript
复制
SELECT 
            n.Type as Type,
            n.UserIdn as UserIdn,
            u.Username as Username,
            n.NewsIdn as NewsIdn,
            n.Header as Header,
            n.Text as Text,
            n.Tags as Tags,
            n.ImageLink as ImageLink,
            n.VideoLink as VideoLink,
            n.DateCreate as DateCreate,
            l.Uplikes as Uplikes,
            ld.DownLikes as DownLikes
        FROM News n 
            left join (Select LikeIdn,NewsIdn,Count(*) as UpLikes FROM Likes WHERE Type='up') as l ON l.NewsIdn=n.NewsIdn
            left join (Select LikeIdn,NewsIdn,Count(*) as DownLikes FROM Likes WHERE Type='down') as ld ON ld.NewsIdn=n.NewsIdn
            left join Users u on u.UserIdn = n.UserIdn
            WHERE (l.Uplikes - ld.DownLikes) < 20 AND DateCreate < STR_TO_DATE('2014-01-01 17:23:41', '%Y-%m-%d %H:%i:%s')
        ORDER BY n.DateCreate Desc LIMIT 0, 10

在它的查询中,我无法获得l.Uplikes as Uplikesld.DownLikes as DownLikes

怎么弄到?

P.S.:如果删除行(l.Uplikes - ld.DownLikes) < 20 AND结果查询有4行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-08 14:41:30

问题是left outer join正在为likesdislikes插入NULL值。因此,使用coalesce()将它们转换为0:

代码语言:javascript
复制
        WHERE (coalesce(l.Uplikes, 0) - coalesce(ld.DownLikes, 0)) < 20 AND
              DateCreate < STR_TO_DATE('2014-01-01 17:23:41', '%Y-%m-%d %H:%i:%s')

顺便说一句,写这个查询有很多种方法。然而,你的版本是不正确的。在两个子查询中需要group by NewsIdn。否则,你会得到总体上的喜欢和不喜欢。但是,两个子查询也是不必要的。您可以使用条件聚合一步而不是两步计算likesdislikes

代码语言:javascript
复制
    FROM News n left join
         (Select NewsIdn, sum(Type = 'up') as UpLikes,  sum(Type = 'down') as dislikes
          FROM Likes
          group by NewsIdn
         ) ud
         ON ud.NewsIdn = n.NewsIdn left join
         Users u
         on u.UserIdn = n.UserIdn
票数 1
EN

Stack Overflow用户

发布于 2014-01-08 14:44:57

是的,正如您已经注意到的,这是因为您在where子句中使用了UplikesDownLikes的值,并且在您喜欢的表中没有相应的行(因此获得null而不是0)。

如果您在where子句中与0合并(我猜在您的选择中),您将得到您提到的这四个结果返回:

代码语言:javascript
复制
SELECT 
        n.Type as Type,
        n.UserIdn as UserIdn,
        u.Username as Username,
        n.NewsIdn as NewsIdn,
        n.Header as Header,
        n.Text as Text,
        n.Tags as Tags,
        n.ImageLink as ImageLink,
        n.VideoLink as VideoLink,
        n.DateCreate as DateCreate,
        COALESCE(l.Uplikes,0) as Uplikes,
        COALESCE(ld.DownLikes,0) as DownLikes
    FROM News n 
        left join (Select LikeIdn,NewsIdn,Count(*) as UpLikes FROM Likes WHERE Type='up' Group by NewsIdn) as l ON l.NewsIdn=n.NewsIdn
        left join (Select LikeIdn,NewsIdn,Count(*) as DownLikes FROM Likes WHERE Type='down' Group by NewsIdn) as ld ON ld.NewsIdn=n.NewsIdn
        left join Users u on u.UserIdn = n.UserIdn
        WHERE (COALESCE(l.Uplikes,0) - COALESCE(ld.DownLikes,0) < 20) AND DateCreate < STR_TO_DATE('2014-01-01 17:23:41', '%Y-%m-%d %H:%i:%s')
    ORDER BY n.DateCreate Desc LIMIT 0, 10

或者如果更容易:

Sql小提琴

编辑: +1给Gordon,因为它注意到子查询中缺少的分组-更新了这个答案以反映这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20998564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档