如何在同一个查询中提到两个聚合函数?

时间:2014-01-10 21:44:50

标签: mysql sql database query-optimization

我有一个SQL查询来从三个不同的表中获取信息,如下所示:

select users.username, users.id, users.avatar, users.daily_tahmin, users.alert, f1.comments_no, f2.tahmins_no, f3.monthly_tahmins_no from users LEFT join 
(SELECT count(comments) AS comments_no, user_id
 FROM comments
  Where user_id = 12
) AS f1  on users.id = f1.user_id  left join 
(
  SELECT count(tahmin) AS tahmins_no, user_id
  FROM tahminler
  Where user_id = 12
) AS f2 on users.id = f2.user_id left join
(
  SELECT count(tahmin) AS monthly_tahmins_no, user_id, matches_of_comments.match_id
  FROM tahminler
    INNER JOIN matches_of_comments on tahminler.match_id = matches_of_comments.match_id
  Where user_id = 12 AND (MONTH( STR_TO_DATE( matches_of_comments.match_date,  '%d.%m.%Y' ) ) =  '01' AND YEAR( STR_TO_DATE( matches_of_comments.match_date,  '%d.%m.%Y' ) ) =  '2014') 
) AS f3 on users.id = f3.user_id
where users.id = 12

,它给出了以下结果:

+------------+----+----------------+--------------+-------+-------------+------------+--------------------+
|  username  | id |     avatar     | daily_tahmin | alert | comments_no | tahmins_no | monthly_tahmins_no |
+------------+----+----------------+--------------+-------+-------------+------------+--------------------+
| cold heart | 12 | 1389002263.jpg |            0 |     0 |          65 |        258 |                 10 |
+------------+----+----------------+--------------+-------+-------------+------------+--------------------+

我执行一些EXPLIAN后,之前的代码没有优化,我尝试对其进行优化,并得到以下查询:

SELECT m.*,count(comments.id)
FROM comments
JOIN
(SELECT users.username, users.id, users.avatar, users.daily_tahmin, users.alert
FROM users
WHERE id=12)as m ON m.id = comments.user_id

我的问题是我无法获取(tahmins_no,monthly_tahmins_no)每次我将它们添加到查询时它会给出错误的结果我找不到一种方法将它们正确地添加到查询中以优化的方式?我可以在这里得到任何人的建议吗?

1 个答案:

答案 0 :(得分:0)

您的简化查询是:

select m.*, count(c.id)
from comments c join
     users m
     on m.id = c.user_id
where m.id = 12
group by m.id;

您应该可以添加每月号码:

select m.*, count(c.id), f3.*
from comments c join
     users m
     on m.id = c.user_id join
     (select count(tahmin) AS monthly_tahmins_no, user_id, moc.match_id
      from tahminler t join
           matches_of_comments moc
           on t.match_id = moc.match_id
      Where user_id = 12 AND 
            MONTH( STR_TO_DATE( moc.match_date,  '%d.%m.%Y' ) ) = 1 AND
            YEAR( STR_TO_DATE( moc.match_date,  '%d.%m.%Y' ) ) =  2014
     ) f3
     on f3.user_id = m.id
where m.id = 12
group by m.id;

month()year()函数返回数字,而不是字符串。我不明白为什么字段match_date将被存储为字符串 - 对于名称中包含 date 的列来说,这似乎是一个愚蠢的选择。