【问题标题】:SQL counts based only one yearSQL 计数仅基于一年
【发布时间】:2013-08-04 02:02:00
【问题描述】:

我尝试了几件事,但找不到过滤此代码以一次只显示一年的方法。我添加了 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_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

我会尽快收集一些数据点...

【问题讨论】:

    标签: php sql date count


    【解决方案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演示

    【讨论】:

    • 抱歉没用,我的 show_date 是数据库中的 DateTime 格式,一切看起来都可以,还有其他想法吗?
    • 您能详细说明一下没有工作是什么意思吗?你得到一个错误,你没有得到任何结果,你得到意想不到的结果?它是什么?恕我直言,是时候展示表格架构和示例数据了。否则会一直在黑暗中拍摄。
    • 另外,您在问题show_datesong_date 中引用了两个不同的列。您实际尝试使用哪一个以及它属于哪个表?
    • 还有一件事。为什么在查询中使用LEFT JOIN。您是否真的有节目(通过 song_id)引用您的 tbl_songs 表中没有的歌曲?恕我直言,它应该是 RIGHT JOIN 或只是 JOIN(如果您不想考虑任何节目中未播放的歌曲)。
    • 只使用 show_date 没有 song_date...我将把我的表和数据放在一起,当我添加 Where 语句时我没有得到任何结果,但没有 where 它可以正常工作拉取所有数据
    【解决方案2】:

    你可以试试这个,让我知道它是否有效?

    YEAR(show_date)=2013

    【讨论】:

    • 很抱歉这不起作用,我想不通,这样的事情应该可以工作......
    • @Nilesh 以我的查询为例,它正在工作,为什么它不适合你?
    【解决方案3】:

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

    这是过滤后的数据

    【讨论】:

    • 我可以看到这会起作用,我之前已经完成了测试,并在其他我想过滤年份的地方使用了该语句,我的代码中是否有某些内容可能已经与 Where 语句冲突?跨度>
    • 首先,您在查询中是否有 where 子句?我在原帖中没有看到。其次,当您说它只是错误代码时;确切的错误是什么?
    • 我的原始帖子中没有 Where 语句,您是正确的。该代码工作正常,但正在获取两年的所有数据,我想一次添加一个在哪里做一年。当我添加 where 子句并运行查询时,什么都没有显示。
    • 我不确定那里发生了什么。您可以尝试使用 YEAR 列提取所有记录,然后按 YEAR 在代码中对它们进行排序/过滤吗?
    【解决方案4】:

    进行日期范围查询的最佳方式如下:

    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
    

    很慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 2018-09-08
      • 1970-01-01
      相关资源
      最近更新 更多