簡體   English   中英

如何從表左聯接中獲取列?

[英]How to get columns from table left join?

SqlFidle在這里。

MySQL查詢:

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 Uplikes ld.DownLikes as DownLikes

如何獲得?

PS:如果刪除行(l.Uplikes - ld.DownLikes) < 20 AND結果查詢有4行。

問題是left outer join NULLlikesdislikes likes插入NULL值。 因此,使用coalesce()將它們轉換為0:

        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進行group by NewsIdn 否則,您將獲得總體的好惡。 但是,兩個子查詢也是不必要的。 您可以使用條件聚合在一個步驟而不是兩個步驟中計算likesdislikes

    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

是的,因為您已經注意到,這是因為您在where子句中使用了UplikesDownLikes的值,並且在likes表中沒有對應的行(因此,您將獲得null而不是0)。

如果您在where子句(和我猜您選擇的那兩個詞)中都將0合並,則會得到您提到的返回的四個結果:

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 Linoff注意到子查詢中缺少分組-更新了此答案以反映這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM