Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于时间戳mysql+PHP组织数据_Php_Mysql_Pdo - Fatal编程技术网

基于时间戳mysql+PHP组织数据

基于时间戳mysql+PHP组织数据,php,mysql,pdo,Php,Mysql,Pdo,我试图以以下方式组织数据输出: 今天、昨天和昨天之前的每件事都有各自的完整日期时间减去时钟时间。为了更好地理解,请查看下面的屏幕截图: 我编写了以下代码: try{ $db = new PDO("mysql:host=" .$hostname. ";dbname=" .$database. "", "" .$user. "", "" .$pass. ""); $db->setAttribute(PDO::ATTR_PERSISTENT, true); $db->se

我试图以以下方式组织数据输出: 今天、昨天和昨天之前的每件事都有各自的完整日期时间减去时钟时间。为了更好地理解,请查看下面的屏幕截图:

我编写了以下代码:

try{
    $db = new PDO("mysql:host=" .$hostname. ";dbname=" .$database. "", "" .$user. "", "" .$pass. "");
  $db->setAttribute(PDO::ATTR_PERSISTENT, true);
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $notifications = $db->prepare("SELECT * FROM reports
    ORDER BY timestamp DESC");
  $notifications->execute();

  $result = (object)$notifications->fetchAll(PDO::FETCH_OBJ);

  echo "<pre>";

  print_r($result);

    echo "</pre>";

}
catch(PDOException $e)
{
    echo $e->getMessage();
}
显然:我想打印所有带有今天时间戳的内容。接下来,所有带有昨天时间戳的内容。等等

SQL:


在PHP中获取所有行并检查日期,然后将同时存在的结果分组到单独的数组中,如下所示:

SELECT *, 'today' as day FROM table WHERE DATE(from_unixtime(comment_date)) = CURRENT_DATE
UNION
SELECT *, 'yesterday' as day FROM table WHERE MONTH(from_unix_MONTH(CURRENT_DATE)) = MONTH(CURRENT_DATE)

现在您可以使用$today\u row、$Dayed\u rows。。。等,并根据需要显示它们。

有多种方法可以实现这一点。 首先,您可以在php端创建单独的调用并合并数据

第二,您可以使用子查询,但我不推荐使用子查询,因为它们有点棘手,并且会占用大量资源

第三,你可以使用联合。根据不同的场景创建3个单独的查询进行选择,然后使用union。这样,您将在一次调用中获得所有结果

//MOCK UP SOME DISPLAY DATA - YOU WOULD USE YOUR QUERY RESULT INSTEAD
$rows = array();
$rows[] = date('Y-m-d H:i:s');
$rows[] = date('Y-m-d H:i:s');
$rows[] = date('Y-m-d H:i:s');
$rows[] = date('Y-m-d H:i:s', mktime(0, 0, 0, date('n'), date('j') - 1, date('Y')));
$rows[] = date('Y-m-d H:i:s', mktime(0, 0, 0, 12, 24, 2014));
$rows[] = date('Y-m-d H:i:s', mktime(0, 0, 0, 12, 25, 2014));
$rows[] = date('Y-m-d H:i:s', mktime(0, 0, 0, 12, 26, 2014));
$rows[] = date('Y-m-d H:i:s', mktime(0, 0, 0, 3, 2, 2001));

//CREATE AN ARRAY OF THE REPLACEMENTS YOU WANT
$aArray = array();
$aArray[date('Y-m-d')] = 'Today';
$aArray[date('Y-m-d', mktime(0, 0, 0, date('n'), date('j') - 1, date('Y')))] = 'Yesterday';
$aArray[date('Y-m-d', mktime(0, 0, 0, date('n'), date('j') - 2, date('Y')))] = 'Day before Yesterday';
$aArray['2014-12-25'] = 'Christmas 2014';

//INITIALIZE SOME VARIABLES
$cLastHeader = '';
$cCurrHeader = '';

//THIS WOULD BE YOUR QUERY RESULTS LOOP
foreach ($rows AS $nNull => $cDate) {
    $cLookup = substr($cDate, 0, 10);  //TRIM OUT THE TIME FROM CURRENT RECORD

    //IS DATE IN ARRAY? IF NOT, FORMAT
    if (isset($aArray[$cLookup])) {
        $cCurrHeader = $aArray[$cLookup];
    } else {
        $cCurrHeader = $cLookup; //WOULD SHOW 'YYYY-MM-DD'
        $cCurrHeader = date('F Y', strtotime($cLookup)); //WOULD SHOW 'MONTH YYYY'
    }

    //HAS HEADER CHANGED? IF SO PRINT
    if ($cCurrHeader != $cLastHeader) {
        $cLastHeader = $cCurrHeader;
        print($cCurrHeader . "\n");
    }

    //PRINT RECORD
    print("\t" . $cDate . "\n");
}

所以基本上,联合是将不同的select语句放在一个查询中。可以根据需要合并任意多个select语句。但是,请注意,您希望所有select语句都返回相同的列,否则会出错。你可能还想了解一下工会的情况。UNION和UNION之间有一些细微的区别,但不是很明显。

下面是一个我将如何处理这个问题的示例。我不会改变你的疑问——这是很好的。假设您希望显示数据库中从最新到最早的帖子排序的所有内容。让PHP来处理繁重的工作。我特意将一些内容拆分为多行,而不是嵌套函数以使其更易于阅读。你觉得合适就浓缩

我不是说这是最好的方法。只有我用的

Today
    2015-05-28 18:40:35
    2015-05-28 18:40:35
    2015-05-28 18:40:35
Yesterday
    2015-05-27 00:00:00
December 2014
    2014-12-24 00:00:00
Christmas 2014
    2014-12-25 00:00:00
December 2014
    2014-12-26 00:00:00
March 2001
    2001-03-02 00:00:00
此操作的输出为:

SELECT IF( DATEDIFF( NOW( ) , `timestamp` ) =0, "Today", if( DATEDIFF( NOW( ) , `timestamp` ) =1, "Yesterday", DATE_FORMAT( `timestamp`, '%M %d' ) ) ) AS day,
id,timestamp,seen
FROM reports
ORDER BY timestamp DESC
试图通过查询解决您的问题,请检查它是否对您有帮助


根据给定的屏幕截图,在今天和昨天之后,此查询将显示月份和日期。

您应该更改MySQL查询以获得日期差异

switch (true) {
    case ($dateDifference===0):
        echo "Today's reports!";
        break;
    case ($dateDifference===1):
        echo "Yesterday's reports!";
        break;
    case ($dateDifference>1):
        echo "Even older reports!";
        break;
    case ($dateDifference<0):
        echo "An unexpected error occurred. Please contact your system administrator!";
}
这里提供了一个示例

然后在dateDifference上运行if语句或switch case,以您想要的方式组织结果。 下面给出了一个合适的开关案例说明示例



您需要在一个查询中完成所有这些吗?如果是,为什么要使事情复杂化?@pregmatch我尽量不使任何事情复杂化,我试图找出如何组织thet SELECT查询,一旦我获得数据并将其输出,就像我在这里发布的打印屏幕一样。谢谢你的意见,太复杂了。只需获取所有结果,直到X,并在PHP迭代期间聚合。这只是一个约会时间…@khudem我读了一些关于工会的书,它们很有趣。您是否有可能向我展示如何在我当前的mysql SELECT查询上应用UNION?@khudem,在这种情况下,SQLFIDLE将不胜感激。非常感谢。@khudem,您提到的第三个选项,是这样的吗:是的,就是这样。这个问题的答案有一个很好的查询供参考。工会将在一次电话会议上给出结果。但是,为了这样构造数据,您需要进行多个调用,并将结果分配给具有关键字“今天”、“昨天”等的对象。我将对此进行进一步的研究。是否可以用打印机打印所有内容?确切的意思是什么?这很有趣,我将尝试一下。等待谢谢你,伙计!所以我想,我应该听,几天前我的直觉告诉我,只有PHP才能处理这个问题,但我拒绝听。嗯,我想知道这个解决方案是否能处理前天以后的数据?很高兴提供帮助。如果您正在运行一个大型站点。您可能可以通过使用一些多维数组并首先按发布日期对内容进行分组来优化这一点。至于你的新问题——是的,最后一个问题是2001年3月。除非你的意思是你能在前天的前一天做出决定。在这种情况下,答案是肯定的。您可以添加任意数量的日期。例如$aArray[date'Y'.-12-25']='Christmas';最终会分裂成2015年12月,圣诞节,12月15日。我添加了一个圣诞节想法的例子。你也可以用相同的文本输入两个日期——只要这两天是连续的,并且它会将它们分组在一个标题下。我不确定我是否可以通过查询来完成这项工作,原因有很多,包括我的系统是可翻译的,也就是说,它会被翻译成其他人类可读的语言。因此,您查询的输出意味着,今天和昨天不能翻译成其他语言,主要是用户的本地设置。@约翰史密斯我想这是您通过查询所能得到的最好结果:无论如何,对您的结果都是最好的。@John
史密斯,要运行任何多语言网站,你不需要担心查询会给你什么。你可以把“今天”、“昨天”作为一个独特的词。将其传递给您的语言功能,该功能将为您提供翻译后的单词。@JohnSmith正如Sanjay Mohnani所解释的,您可以进行翻译。我已根据您所附的图片编辑了我的查询。此外,如果数据较大,我想,应该将负载分配给mysql,而不是使用php条件和具有适当索引的函数。这是我的想法,如果我错了,请纠正我。
Today
    2015-05-28 18:40:35
    2015-05-28 18:40:35
    2015-05-28 18:40:35
Yesterday
    2015-05-27 00:00:00
December 2014
    2014-12-24 00:00:00
Christmas 2014
    2014-12-25 00:00:00
December 2014
    2014-12-26 00:00:00
March 2001
    2001-03-02 00:00:00
SELECT IF( DATEDIFF( NOW( ) , `timestamp` ) =0, "Today", if( DATEDIFF( NOW( ) , `timestamp` ) =1, "Yesterday", DATE_FORMAT( `timestamp`, '%M %d' ) ) ) AS day,
id,timestamp,seen
FROM reports
ORDER BY timestamp DESC
SELECT *,DATEDIFF(NOW(),`timestamp`) as `dateDifference` FROM `reports` ORDER BY `dateDifference`
switch (true) {
    case ($dateDifference===0):
        echo "Today's reports!";
        break;
    case ($dateDifference===1):
        echo "Yesterday's reports!";
        break;
    case ($dateDifference>1):
        echo "Even older reports!";
        break;
    case ($dateDifference<0):
        echo "An unexpected error occurred. Please contact your system administrator!";
}