GROUP BY mysql只显示一行。但是也想要重复

时间:2013-03-04 09:23:43

标签: php mysql database

我的表结构是

id  order_id  location time    date
 1   951        x              2/03/2013
 2   951        x      13:00   2/03/2013
 3   951        y              3/03/2013

我想在php中用日期分组显示这些内容,如

Date 2/03/2013
Orderid 951 location x
Orderid 951 location x

Date 3/03/2013
Orderid 951 location y

mysql查询即时执行

select * from table where order_id=951 GROUP BY date ORDER BY id ASC

但是此查询仅返回相同数据的第一行。如何按日期类别显示所有重复项。如何在php中使用它来显示数据,将日期作为单独的变量。

我正在编辑问题,让您知道日期可以是任何我想要按日期在组中显示的订单ID,包括重复。

5 个答案:

答案 0 :(得分:1)

如果要显示表中的所有行,最好是ORDER BY date, id,然后在PHP中进行分组。

$result = mysql_query("select * from table ORDER BY data ASC,id ASC");
$last_date = "";
while(($row=mysql_fetch_assoc($result)))
{
    if($last_date != $row['date'])
    {
        echo "Date " . $row['date'] . "\n";
    }
    echo "Orderid ". $row['order_id']." location " . $row['location']. "\n";
}

答案 1 :(得分:1)

使用STR_TO_DATE()功能按日期排序

$result = mysql_query("select * from table ORDER BY STR_TO_DATE(date, '%d/%m/%Y') ASC, id ASC");
$last_date = "";
while(($row=mysql_fetch_assoc($result)))
{
    if($last_date != $row['date'])
    {
        echo "Date " . $row['date'] . "\n";
    }
    echo "Orderid ". $row['order_id']." location " . $row['location']. "\n";
}

答案 2 :(得分:1)

select * from table where order_id=951 ORDER BY date DESC, id ASC

然后从PHP操作

Order By不会返回分组内的行。如果您真的想使用sql,那么您可以尝试GROUP_CONCAT,它将分组的行值作为连接字符串返回,然后将其从PHP中拆分。

答案 3 :(得分:1)

由于您的表格拥有time列,因此您应该在查询中考虑,订单是默认的升序,因此您可以跳过写asc

select * from table where order_id=951 order by date,time,id;

您可以创建一个全局php变量来存储您读取的当前日期,每次在while循环中进行比较,如果它与全局日期不同,则打印一些内容以与最后一组分开。

答案 4 :(得分:0)

另一种解决方案是使用GROUP_CONCAT

select date,group_concat("Location " , location, "\n") from table where order_id=951 GROUP BY date ORDER BY id ASC