在mysql中遇到麻烦

时间:2013-05-06 13:31:39

标签: php mysql laravel

嗨大家好我使用这个MYSQL查询来获得当前月份的顶级上传用户和他们的图像视图总数:

    $users = DB::query("SELECT * ,
  COUNT(p.id) as numPics,
  SUM(p.views) as totalViews

FROM
  images p 
INNER JOIN
  users u
ON
  p.user_id = u.id
 WHERE 
 p.created_at >= \"$current_month\"
GROUP BY p.user_id
ORDER BY totalViews DESC LIMIT 10");

totalViews返回所有图片的总视图的麻烦,我想要的是获得当前月份上传的图片的总观看次数。 谢谢。

4 个答案:

答案 0 :(得分:1)

在mysql中使用 MONTH(NOW())获取当月的数据

p.created_at >= MONTH(NOW())

答案 1 :(得分:0)

将group by语句和select子句更改为此

SELECT * ,
  (SELECT COUNT(*) FROM images where id = p.id) as numPics,
  SUM(p.views) as totalViews

FROM
  images p 
INNER JOIN
  users u
ON
  p.user_id = u.id
 WHERE 
 p.created_at >= \"$current_month\"
GROUP BY p.user_id, p.id
ORDER BY totalViews DESC LIMIT 10"

答案 2 :(得分:0)

您需要使用extract method

"SELECT * ,
  (SELECT COUNT(*) FROM images where id = p.id) as numPics,
  SUM(p.views) as totalViews

FROM
  images p 
INNER JOIN
  users u
ON
  p.user_id = u.id
 WHERE 
EXTRACT(YEAR_MONTH FROM p.created_at) >= EXTRACT(YEAR_MONTH FROM \"$current_month\")
GROUP BY p.user_id, p.id
ORDER BY totalViews DESC LIMIT 10"

变量的名称是miss-leading,即$ current_month,但你的评论说它有一个时间戳值,例如“2013-05-01 23:59:59”

答案 3 :(得分:0)

这个查询看起来像一个完美的例子,使它更通用一些。当您为created_at添加上限时,您也可以使用相同的查询来查找上个月(或任何其他月份)的上限。

$lower_limit = date('Y-m-d', strtotime('first day of this month'));
$upper_limit = date('Y-m-d', strtotime('first day of next month'));

我假设你正在使用PDO prepared statements,所以我只提供SQL。

SELECT u.*,
  COUNT(p.id) as numPics,
  SUM(p.views) as totalViews
FROM
  images p 
INNER JOIN
  users u
ON
  p.user_id = u.id
WHERE 
  p.created_at >= :lower_limit
AND p.created_at < :upper_limit
GROUP BY p.user_id
ORDER BY totalViews DESC
LIMIT 10

请注意,这不会选择任何图像。结果集应该是一致的,当您按user_id分组时,您无法控制结果集中的图像数据。

相关问题