计算并选择MySQL中特定字段的所有日期

时间:2015-03-17 15:42:07

标签: mysql sql

我有这样的数据格式:

+----+--------+---------------------+
| ID | utente | data                |
+----+--------+---------------------+
| 1  | Man1   | 2014-02-10 12:12:00 |
+----+--------+---------------------+
| 2  | Women1 | 2015-02-10 12:12:00 |
+----+--------+---------------------+
| 3  | Man2   | 2016-02-10 12:12:00 |
+----+--------+---------------------+
| 4  | Women1 | 2014-03-10 12:12:00 |
+----+--------+---------------------+
| 5  | Man1   | 2014-04-10 12:12:00 |
+----+--------+---------------------+
| 6  | Women1 | 2014-02-10 12:12:00 |
+----+--------+---------------------+

我想制作一份报告,以这样的方式组织ouptout:

+---------+--------+-------+---------------------+---------------------+---------------------+
| IDs     | utente | count | data1               | data2               | data3               |
+---------+--------+-------+---------------------+---------------------+---------------------+
| 1, 5    | Man1   | 2     | 2014-02-10 12:12:00 | 2014-04-10 12:12:00 |                     |
+---------+--------+-------+---------------------+---------------------+---------------------+
| 2, 4, 6 | Women1 | 3     | 2015-02-10 12:12:00 | 2014-03-10 12:12:00 | 2014-05-10 12:12:00 |
+---------+--------+-------+---------------------+---------------------+---------------------+

包含相同用户(utente)多次的所有行将包含在一行中,其中包含所有日期和记录计数。 感谢

2 个答案:

答案 0 :(得分:3)

虽然编写一个以您想要的格式返回数据的查询当然是可能的,但我建议您使用GROUP BY查询和两个GROUP_CONCAT聚合函数:

SELECT
  GROUP_CONCAT(ID) as IDs,
  utente,
  COUNT(*) as cnt,
  GROUP_CONCAT(data ORDER BY data) AS Dates
FROM
  tablename
GROUP BY
  utente

然后在应用程序级别,您可以将日期字段拆分为多个列。

答案 1 :(得分:1)

看起来像一个相当标准的“破碎”报告,只是因为你的日期水平延伸而不是向下延伸而变得复杂......

SELECT * FROM t ORDER BY utente, data
$lastutente = $lastdata = '';
echo "<table>\n";
while ($row = fetch()) {
    if ($lastutente != $row['utente']) {
        if ($lastutente != '') {
            /****
             * THIS SECTION REF'D BELOW
             ***/
            echo "<td>$cnt</td>\n";
            foreach ($datelst[] as $d) 
                echo "<td>$row[data]</td>\n";
            for ($i = count($datelst); $i < $NumberOfDateCells; $i++)
                echo "<td>&nbsp;</td>\n";
            echo "</tr>\n";
            /****
             * END OF SECTION REF'D BELOW
             ***/
        }
        echo "<tr><td>$row[utente]</td>\n"; // start a new row - you probably want to print other stuff too
        $datelst = array();
        $cnt = 0;
    }
    if ($lastdata != $row['data']) {
        datelst[] = $row['data'];
    }
    $cnt += $row['cnt']; // or $cnt++ if it's one per row
}
print the end of the last row - see SECTION REF'D ABOVE
echo "</table>\n";

您可以在上面的查询中添加GROUP BY utente, data以增加对mysql的负担,减少对代码的负担 - 然后您应该SUM(cnt) as cntCOUNT(*) as cnt