【问题标题】:trouble with WHERE in mysqlmysql中WHERE的问题
【发布时间】:2013-04-30 06:35:40
【问题描述】:

大家好,我正在使用这个 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返回所有图片的总浏览量的麻烦,我想要的是获取当月上传的图片的总浏览量。 谢谢。

【问题讨论】:

  • 你能直接把我在哪里可以找到解决方案 bcz 完整的代码工作正常,除了我发布的内容。
  • 您尝试过子查询吗?请尝试一下您可能会得到结果
  • 可以放一些例子吗?
  • SELECT * , COUNT(p.id) as numPics,(select SUM(p.views) as totalViews where user_id=p.id) 试试这样的
  • 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 'WHERE p.created_at >= "2013-05-01 23:59:59") 附近使用正确的语法)

标签: php mysql laravel


【解决方案1】:

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

p.created_at >= MONTH(NOW())

【讨论】:

  • 虽然这是个好建议,但它并不能直接回答问题。考虑扩展您的答案以识别 OP 当前的问题。
  • 我使用这个结构: $current_month = date('Y-m-d', strtotime("本月的第一天")) 。 '23:59:59';
  • created_at的数据类型是什么?
  • @Hamza:在 mysql 本身中有获取当前月份的函数。那么为什么要使用 php 获取当前月份并在查询中实现呢?
  • 嗯,会不会这么简单:把strto*time*改成strto*date*
【解决方案2】:

将group by语句和select子句改为this

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"

【讨论】:

    【解决方案3】:

    你需要使用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"
    

    变量的名称是错误的,即 $current_month ,但您的 cmets 说它有一个时间戳值,例如“2013-05-01 23:59:59”

    【讨论】:

      【解决方案4】:

      这个查询看起来是一个完美的例子,使它更通用一点。当您为 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分组时,你无法控制结果集中的图像数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-06
        相关资源
        最近更新 更多