选择一个每月最高分的获胜者

时间:2014-03-12 07:16:23

标签: php mysql sql

我需要选择最高得分手作为月度获胜者。我也希望展示以前的获奖者。我当前的查询仅选择前一个月的获胜者,但我如何选择之前的所有月度获奖者?

我的疑问:

    function month_winner_now()
    {
        $query = $this->db->query("SELECT winner.id,winner.score,winner.user_id,winner.date, user.id,user.username,user.email,user_profile.user_image,user_profile.hometown,user_profile.country FROM `winner` LEFT JOIN `user` ON user.id = winner.user_id LEFT JOIN `user_profile` ON user_profile.user_id = winner.user_id WHERE  MONTH(CURDATE())= MONTH(winner.date) ORDER BY winner.score DESC
LIMIT 1");


            return $query->result_array();
    }


My current output :

"monthly winners":[
    {
        "id":"5",
        "score":"1256",
        "user_id":"5",
        "date":"2014-03-05",
        "username":"",
        "email":"",
        "user_image":"",
        "hometown":"",
        "country":""
    }

但我需要输出

  "monthly winners":[
        {
            "id":"4",
            "score":"233",
            "user_id":"4",
            "date":"2014-03-02",
            "username":"Mahmudul Hasan Swapon",
            "email":"",
            "user_image":"",
            "hometown":"",
            "country":""
        },
        {
            "id":"7",
            "score":"123",
            "user_id":"7",
            "date":"2014-03-04",
            "username":"Prosanto Biswas",
            "email":"",
            "user_image":"",
            "hometown":"",
            "country":""
        }
    ],

每月获奖者json数组显示之前的所有月份获奖者,但每个月应该有一名获胜者。

DB表看起来像

   id   |   name   |  userid  |  score  |      date      |
   ------------------------------------------------------------
    1   |   john   |    1     |   44    |  2013-03-2 
    2   |   mary   |    2     |   59    |  2013-03-5  
    3   |   john   |    12    |   38    |  2013-03-8 
    4   |   elvis  |    3     |   19    |  2013-02-10 
    5   |   john   |    11    |   1002  |  2013-01-11
    6   |   johnah |    10    |   200   |  2013-01-11

5 个答案:

答案 0 :(得分:1)

我重新创建了sql查询并添加了一个字段"month_of_year",现在我认为根据您的要求对您有所帮助

SELECT 
   winner.id,winner.score,winner.user_id,winner.date,
   user.id,user.username,user.email,user_profile.user_image,
   user_profile.hometown,user_profile.country,
   date_format( winner.date, '%Y-%m' ) AS month_of_year
FROM
   `winner` 
   LEFT JOIN `user` 
     ON user.id = winner.user_id 
   LEFT JOIN `user_profile` 
     ON user_profile.user_id = winner.user_id 
GROUP BY month_of_year
ORDER BY winner.score DESC

答案 1 :(得分:0)

  

我想展示之前的所有月份获奖者

您正在检查月份是否相等,因此省略了其他月份(之前或之后)。根据具体情况,将比较更改为<=>=

如果您使用LIMIT 1,如果在当月存在记录,则可能无法获取其他月份详细信息。

试试这个:

SELECT 
  winner.id -- etc fields
FROM 
  `winner` 
  LEFT JOIN `user` 
    ON user.id = winner.user_id 
  LEFT JOIN `user_profile` 
    ON user_profile.user_id = winner.user_id 
WHERE  
  date_format( winner.date, '%Y%m' ) <= date_format( CURDATE(), '%Y%m' ) 
ORDER BY 
  winner.score DESC

答案 2 :(得分:0)

对于上个月的获胜者:

$query = $this->db->query("
    SELECT winner.id,winner.score,winner.user_id,winner.date, user.id,user.username,user.email,user_profile.user_image,user_profile.hometown,user_profile.country 
    FROM `winner`
    LEFT JOIN `user` 
    ON user.id = winner.user_id 
    LEFT JOIN `user_profile` 
    ON user_profile.user_id = winner.user_id 
    WHERE MONTH(DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) = MONTH(winner.date) ORDER BY winner.score DESC LIMIT 1
");

答案 3 :(得分:0)

尝试类似这样的查询:

SELECT * FROM user
INNSER JOIN
(SELECT user_id, MAX(score) AS s, MONTH(date) AS d
FROM winner
GROUP BY MONTH(date)) monthlyWinner ON (user.id = monthlyWinner.user_id)

答案 4 :(得分:0)

试试这个,

;with cte as 
(
select Datename(mm,[date]) as m
        --,max(amount_paid)
         ,Rank() over(PARTITION BY  Datename(mm,[date]) order by [score] desc) as rr
         ,[score]
         ,id
from myTbl
--where DATEDIFF(YY,[date],'1/1/2013') = 0
)
select * from cte
left join myTbl as r on r.id=cte.id
where rr = 1