[英]How to get columns from table left join?
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
NULL
為likes
和dislikes
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
。 否則,您將獲得總體的好惡。 但是,兩個子查詢也是不必要的。 您可以使用條件聚合在一個步驟而不是兩個步驟中計算likes
和dislikes
:
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子句中使用了Uplikes
和DownLikes
的值,並且在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
或者,如果更容易:
編輯: +1到Gordon Linoff注意到子查詢中缺少分組-更新了此答案以反映這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.