SQL输出中的单独月份

时间:2018-10-03 20:29:51

标签: php mysql sql

我有以下SQL语句:

SELECT id, name, date FROM money_month WHERE user_id = '{$_SESSION['id']}';

它返回我这样的行:

| id | name   | date       |
|----|--------|------------|
| 1  | Mike   | 2018-09-05 |
| 2  | Nelson | 2018-09-07 |
| 3  | Bity   | 2018-09-08 |
| 4  | Ory    | 2018-10-04 |

如果我按以下方式使用分组依据:

SELECT id, name, date FROM money_month WHERE user_id = '{$_SESSION['id']}' GROUP BY YEAR(date), MONTH(date) ORDER BY date DESC;

它有效,但是仅显示每个月的第一行,如下所示:

| id        | name | date       |
|-----------|------|------------|
| September |      |            |
| 1         | Mike | 2018-09-05 |
| October   |      |            |
| 4         | Ory  | 2018-10-04 |

是否可以将行与月份分隔成这样?

| id        | name   | date       |
|-----------|--------|------------|
| September |        |            |
| 1         | Mike   | 2018-09-05 |
| 2         | Nelson | 2018-09-07 |
| 3         | Bity   | 2018-09-08 |
| October   |        |            |
| 4         | Ory    | 2018-10-04 |

我的SQL输出

$month = '';
    while($row = $result->fetch_assoc()) {


        if($month != $row["date"])
        {
            $month = substr($row["date"],5,2);
            if ($month == "10") { $output= "October"; }
            if ($month == "9") { $output= "September"; }

            echo $output;
        }

尝试实现以下目标: enter image description here

但是我的输出看起来像这样:enter image description here

3 个答案:

答案 0 :(得分:2)

如果我对问题的理解正确,那么您只需要按日期排序

SELECT YEAR(date) desc, MONTH(date),  id, name, date 
FROM money_month 
WHERE user_id = '{$_SESSION['id']}' 
Order BY 1 desc,   2 desc

使用分组依据时,您应该aggregate列,它们不在分组依据子句中

答案 1 :(得分:1)

这是一段PHP代码,应该为您要实现的目标提供良好的开端。它基于您的示例money_month表和所需的输出图像。

$query = "SELECT id, name, date FROM money_month ORDER BY date DESC";
$result = $conn->query($query) or die("Query failed!");
$month = $year = 0;
echo "<table border=\"1\">";
while ($row = $result->fetch_assoc()) {
    $date = date_create_from_format('Y-m-d', $row['date']);
    $this_year = (int)$date->format('Y');
    $this_month = (int)$date->format('n');
    if ($year != $this_year) {
        echo "<tr><td colspan = \"3\">$this_year</td></tr>\n";
        $year = $this_year;
    }
    if ($month != $this_month) {
        echo "<tr><td>" . $date->format('M') . "</td><td>{$row['name']}</td><td>{$row['date']}</td>";
        $month = $this_month;
    }
    else {
        echo "<tr><td></td><td>{$row['name']}</td><td>{$row['date']}</td>";
    }
}
echo "</table>";

这将为您提供看起来像这样的输出,然后您应该可以根据需要设置其样式:

<table border="1">
  <tr><td colspan = "3">2018</td></tr>
  <tr><td>Oct</td><td>Ory</td><td>2018-10-04</td></tr>
  <tr><td>Sep</td><td>Bity</td><td>2018-09-08</td></tr>
  <tr><td></td><td>Nelson</td><td>2018-09-07</td></tr>
  <tr><td></td><td>Mike</td><td>2018-09-05</td></tr>
</table>

enter image description here

答案 2 :(得分:0)

您可以尝试以下sql:

SELECT YEAR(date) y, MONTH(date) m, name, date FROM ta WHERE user_id = '{$_SESSION['id']}' ORDER BY y desc, m desc, date desc;

然后,查询结果如下:

y       m   id  name    date
2018    9   4   klkvv   2018-09-18
2018    9   1   fsdfsa  2018-09-01
2018    7   3   mujfis  2018-07-05

然后,您可以使用ym来匹配年份和月份。