0

我已经尝试了几件事,但我找不到过滤此代码以一次只显示一年的方法。我添加了 WHERE 语句,以及如下语句:

 DATE_FORMAT(show_date, '%Y') = 2013

但似乎没有任何效果,它只是错误代码并且什么也没显示......

 $mostplayed = mysqli_query($con,"SELECT tbl_shows.song_id, tbl_songs.song_name,    
 count(tbl_shows.song_id) as cnt, MID(song_name,1,35) as short_name, tbl_shows.show_date
 FROM tbl_shows LEFT JOIN tbl_songs 
 ON tbl_shows.song_id = tbl_songs.song_id
 GROUP by tbl_shows.song_id
 ORDER by count(tbl_shows.song_id) desc
 LIMIT 5");

  echo "<table style='float: left; height:150px; margin-right:30px;'>";
  echo "<tr style='background-color:transparent;'>";
  echo "<td>";
  echo "<h4>Most Played Songs:</h4>";

  while($row = mysqli_fetch_array($mostplayed))

  {
  echo $row['short_name'];
  echo "  (" .  $row['cnt'].")</br>"; 
  }
  echo "</td></tr></table>";

代码本身返回 Song 后跟括号中的计数。谁能指出我如何一次只显示一年,根据 song_date 年份过滤掉数据?谢谢你。任何帮助,将不胜感激。

上面的代码有效,但获取了两年的所有数据……下面的代码没有返回任何内容

SELECT tbl_shows.song_id, tbl_shows.show_date, tbl_songs.song_name, 
count(tbl_shows.song_id) as cnt, MID(song_name,1,35) as short_name
FROM tbl_shows LEFT JOIN tbl_songs WHERE show_date BETWEEN '2013-01-01' AND '2013-12-31'
ON tbl_shows.song_id = tbl_songs.song_id
GROUP by tbl_shows.song_id
ORDER by count(tbl_shows.song_id) desc
LIMIT 5

我很快就会收集一些数据点......

4

4 回答 4

1

更新我相信你的查询应该是这样的

SELECT tbl_shows.song_id, 
       tbl_songs.song_name,    
       COUNT(tbl_shows.song_id) cnt, 
       MID(tbl_songs.song_name,1,35) short_name, 
       tbl_shows.show_date
  FROM tbl_shows RIGHT JOIN tbl_songs 
    ON tbl_shows.song_id = tbl_songs.song_id
   AND tbl_shows.show_date BETWEEN '2013-01-01' AND '2013-12-31'
 GROUP BY tbl_shows.song_id
 ORDER BY COUNT(tbl_shows.song_id) DESC
 LIMIT 5

样本输出:

| 歌曲ID | 歌曲名 | 碳纳米管 | SHORT_NAME | 显示日期 |
-------------------------------------------------- --------------------------
| 第568章 歌曲名 D | 2 | 歌曲名 D | 2013 年 7 月 19 日 00:00:00+0000 |
| 51 | 歌曲名 A | 2 | 歌曲名 A | 2013 年 4 月 24 日 00:00:00+0000 |
| 13 | 歌名 E | 1 | 歌名 E | 2013 年 7 月 19 日 00:00:00+0000 |
| 368 | 歌曲名称 B | 1 | 歌曲名称 B | 2013 年 7 月 19 日 00:00:00+0000 |
| 168 | 歌名 C | 1 | 歌名 C | 2013 年 6 月 28 日 00:00:00+0000 |

这是SQLFiddle演示

于 2013-08-04T02:09:28.213 回答
0

你能试试这个,让我知道它是否有效吗?

年份(show_date)=2013

于 2013-08-04T02:05:59.533 回答
0

用户@user2510115 所说的应该有效。这是样本数据的快照,其中 2013 年的 4 条记录 3 条记录和 2014 年的 1 条记录

在此处输入图像描述

这是过滤后的数据

在此处输入图像描述

于 2013-08-04T02:27:37.250 回答
0

进行日期范围查询的最佳方式是这样的:

where yourfield >= the starting date
and yourfield < the day after the end date

第一个原因是准确性。如果您的日期包含时间组件,则此查询仍将提供所需的结果。二是速度。使用类似的功能

where DATE_FORMAT(show_date, '%Y') = 2013

或者

where YEAR(show_date)=2013

是缓慢的。

于 2013-08-04T02:28:18.867 回答