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

时间:2011-07-28 02:38:30

标签: php mysql

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

location|name 
------------- 
NY|john  
London|neil  
NY|clair

我使用

检索数据
SELECT * FROM table

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>

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

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

NY
            john
            clair

London
            neil

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

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

3 个答案:

答案 0 :(得分:5)

对于你的例子,我会这样做:

SELECT * FROM table ORDER BY location

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

接下来,对于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>

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

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

答案 1 :(得分:1)

查询中的

尝试使用DISTINCT location

答案 2 :(得分:0)

如果你想使用表行交替颜色的表,我建议你使用前端框架Bootstrap。详细了解此here

对于交替行颜色的另一个类似问题(&#34;条纹行&#34;),使用Bootstrap的解决方案,请参阅Alternating Row Colors in Bootstrap 3 - No Table

注意:第一个链接与Bootsrap v.4有关,第二个链接与Bootstrap v.3有关。两者都应该让您了解条带行功能,独立于Bootstrap版本。