为什么count()不正确?

时间:2014-01-08 15:35:41

标签: mysql

SqlFidlle here.

MySQL查询1:

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') 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 NewsIdn = '905554' AND (COALESCE(l.Uplikes,0) - COALESCE(ld.DownLikes,0)) < 20 AND DateCreate < STR_TO_DATE('2014-01-01 18:22:02', '%Y-%m-%d %H:%i:%s')
ORDER BY l.UpLikes Desc LIMIT 0, 10

MySQL查询2:

SELECT * FROM Likes WHERE NewsIdn = '905554' AND Type = 'up'

问题发生是因为Uplikes不等于mysql_num_rows(SELECT * FROM Likes WHERE NewsIdn = '$NewsIdn' AND Type = 'up')

有人可以发现我的错误吗?

3 个答案:

答案 0 :(得分:1)

这不是一个糟糕的问题。不确定为什么它被downvoted。基本上你想做类似以下的事情。我把它放在SQL Fiddle中它给你1投票和0 downvote。我想你可以从那里拿走它。

            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,
            Count(Likes1.Type) as Uplikes,
            Count(Likes2.Type) as Downlikes
        FROM News n
            LEFT JOIN Likes ON Likes.NewsIdn = n.NewsIdn 
            LEFT JOIN Likes Likes1 ON Likes.id = Likes1.id AND Likes1.Type = 'up'
            LEFT JOIN Likes Likes2 ON Likes.id = Likes2.id AND Likes2.Type = 'down'
        WHERE n.NewsIdn = '905554'

答案 1 :(得分:0)

在此查询中:

SELECT 
   ...
    COALESCE(l.Uplikes,0) as Uplikes, -- <-- This line
    COALESCE(ld.DownLikes,0) 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 -- <-- This lin
  ...
    WHERE NewsIdn = '905554' AND ...-- <-- This line

正在研究Uplikes的值并在不检查条件Newsidn='905554'

的情况下显示

IE:如果你只执行这一行,你只会收到4行,并且这个值在Big查询中显示为Uplikes,而没有使用NewsIdn进行检查,这就是为什么你在uplikes中有4的原因

Select LikeIdn,NewsIdn,Count(*) as UpLikes FROM Likes WHERE Type='up'

http://sqlfiddle.com/#!2/2480c/73

<强>编辑: 添加:and NewsIdn ='905554'到子查询应该可以正常工作

SELECT 
            ...
        FROM News n 
            left join (Select LikeIdn,NewsIdn,Count(*) as UpLikes FROM Likes WHERE Type='up' and NewsIdn ='905554') as l ON l.NewsIdn=n.NewsIdn -- <-- This line was modified
            left join (Select LikeIdn,NewsIdn,Count(*) as DownLikes FROM Likes WHERE Type='down' and NewsIdn ='905554') as ld ON ld.NewsIdn=n.NewsIdn  <-- This line was modified
            ...
        ORDER BY l.UpLikes Desc LIMIT 0, 10;

http://sqlfiddle.com/#!2/2480c/83

答案 2 :(得分:-1)

尝试使用JOIN而不是LEFT JOIN。