在PHP/MySQL中为列分组相同的行

Umu*_*acı 1 php mysql

假设我有一个如下所示的表结构

location|name 
------------- 
NY|john  
London|neil  
NY|clair
Run Code Online (Sandbox Code Playgroud)

我使用检索数据

SELECT * FROM table
Run Code Online (Sandbox Code Playgroud)

HTML视图文件如下:

<table>  
<tr><td>location</td><td>name</td>  
<?php foreach($rows as $row):>  
<tr><td><?=$row->location></td><td><?=$row->name></td>  
<?php endforeach;>  
</table>
Run Code Online (Sandbox Code Playgroud)

正如您所猜测的,它会多次输出一行的每一列.

我真正想要的是,将它们列为,

NY
            john
            clair

London
            neil
Run Code Online (Sandbox Code Playgroud)

如果我可以在纽约和伦敦之间使用交替的颜色也会很棒.

ps:我有太多的东西要分组,简单的解决方法是不合适的.

Saj*_*jid 6

举个例子,我会这样做:

SELECT * FROM table ORDER BY location
Run Code Online (Sandbox Code Playgroud)

现在,这些地点将成群结队.您可以添加以逗号分隔的更多列.

接下来,对于PHP:

<?php $lastLocation = 'havenotseenityet'; ?>
<table>  
<tr><td>location</td><td>name</td>  
<?php foreach($rows as $row):>  
    <tr>
    <?php if ($lastLocation != $row->location) {
        $lastLocation = $row->location;
        ?>
    <td><?=$row->location></td><td><?=$row->name></td>
    <?php
    } else {
        ?>
        <td></td><td><?=$row->name></td>  
    } ?>
<?php endforeach;>  
</table>
Run Code Online (Sandbox Code Playgroud)

我们在这里做的是获取行,以便相同的位置彼此相邻(并且排序 - 彼此相邻是副作用).然后我们跟踪我们看到的最后一个位置,当我们看到一个新位置时,我们会显示位置,否则我们会隐藏它直到我们看到一个新位置.这可以扩展到任意数量的项目,但要记住,如果你排序state, city,那么当你看到不同的状态时,你必须让城市也看不到.

最后,请注意我没有以$ lastLocation = null开头.这是因为null是DB列的有效值,并且您不想绊倒它.