【问题标题】:How to detect if date changes in select query [duplicate]如何检测选择查询中的日期是否更改[重复]
【发布时间】:2016-09-16 05:03:10
【问题描述】:

我正在使用以下 SQL 查询通过按日期排序的内连接选择行。

SELECT    *
FROM      clubnights 
INNER     JOIN club ON clubnights.club = club.club_ID 
WHERE     visibility = 0
AND       date >= CURDATE()
ORDER BY  clubnights.date ASC

然后我通过 PHP while 循环将所有数据加载到我的 HTML 中。

我的目标是在任何给定日期的每个部分上方回显一个 HTML 标题。

因此,当通过选择查询检测到日期更改时,我希望检测(通过 PHP 或 SQL)。基本上,我想将最后一个“日期”列与当前列进行比较,如果它们不匹配,我将通过 PHP 回显一些内容。

一个例子,假设以下是行:

2016-09-16 - Row 1 // Detect 'change' here as it's the first row

2016-09-16 - Row 2

2016-09-16 - Row 3

2016-09-16 - Row 4

2016-09-16 - Row 5

2016-09-17 - Row 6 // Detect change here as date has changed

2016-09-17 - Row 7

2016-09-17 - Row 8

编辑:我正在使用 MySQL

【问题讨论】:

  • 您使用的是哪个 RDBMS?
  • @GiorgosBetsos 我正在使用 MySQL。应该提到这一点。
  • 您在给定日期内如何订购?
  • 没有。 在给定日期内,您想使用哪一列来对记录进行排序?
  • MySQL 中没有 no 内部命令。为了使这更容易,您如何得出行号?你有这方面的专栏吗?

标签: php mysql sql


【解决方案1】:

如果我理解您的要求,那么对于共享同一日期的记录组,club_ID 最小的记录是该组中的第一个记录。在下面的答案中,我使用子查询来查找每个日期的最小值 club_ID。然后将此子查询连接到您的原始查询,以确定每个日期的第一条记录。

SELECT clubnights.*,
       club.*,
       CASE WHEN t.club_ID IS NOT NULL THEN 'change' END AS date_changed
FROM clubnights
INNER JOIN club
    ON clubnights.club = club.club_ID
LEFT JOIN
(
    SELECT MIN(club.club_ID) AS club_ID,
           clubnights.date AS date
    FROM clubnights
    INNER JOIN club
        ON clubnights.club = club.club_ID
    GROUP BY clubnights.date
) t
    ON clubnights.date = t.date AND
       club.club_ID    = t.club_ID

请注意,我更喜欢这种解决方案而不是处理 PHP 表示层中的问题,因为 MySQL 旨在有效地处理数据,而 PHP 则要少得多。

【讨论】:

    【解决方案2】:
    SELECT    *,
             CASE WHEN @dd!=date THEN 1 ELSE 0 END as changed,
             @dd:=date
    FROM      clubnights, (select @dd:=null) 
        INNER JOIN club ON clubnights.club = club.club_ID 
    WHERE     visibility = 0
    AND       date >= CURDATE()
    ORDER BY  clubnights.date ASC
    

    您可以定义一个变量并与当前日期相比逐行更改

    【讨论】:

      【解决方案3】:

      好吧,我对局部变量很有帮助。使用以下方式!

      当您使用 php 循环在表中显示数据时,请使用以下算法

      *我假设数据库已连接。

      <?php
         $date2 = sortotime("today");
      $q = mysql_query("select your_date_column_name as dt from your_table_name");
      while($obj = mysql_fetch_object($q))
      {
      $date1 = $obj->dt;
      if(strtotime($date1) != strtotime($date2))
      { echo "Row Changed"; echo"<br/>"; $date2 = $date1; }
      
      echo $date1;
      

      希望对你有帮助:)

      【讨论】:

      • mysql_*() 函数已在多年前被弃用,并从 php v7 中删除。请不要建议使用此 api 的任何解决方案。
      • 好的。我以后会照顾它的。
      【解决方案4】:

      你可以从mysql中选择日期升序排列的数据,然后将它们比较到php代码中,示例:

      $servername = "localhost";  
      $username = "username";  
      $password = "password";  
      $dbname = "myDB";
      
      // Create connection  
      $conn = new mysqli($servername, $username, $password, $dbname);  
      // Check connection  
      if ($conn->connect_error) {  
         die("Connection failed: " . $conn->connect_error);  
      }   
      
      $sql = "same as your query";  
      $result = $conn->query($sql);  
      $previousDate = DateTime::createFromFormat('Y-m-d', '1990-01-01');  
      if ($result->num_rows > 0) {  
      // output data of each row  
      while($row = $result->fetch_assoc()) {  
       $mysqlDate= date('Y-m-d', $row["date"]);  
         if($previousDate != $mysqlDate)  
          {  
          echo "two different dates";  
          $previousDate = $mysqlDate;  
           }  
      
         }  
      } else {  
      echo "0 results";  
      }  
      $conn->close();
      

      【讨论】:

        猜你喜欢
        • 2021-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-25
        • 2013-05-29
        • 2011-02-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多