php - 列表问题,GROUP mysql

标签 php mysql sql twitter-bootstrap pdo

这是 Mysql 表的模型示例:

| ID  |  Country  |  City      |
________________________________

| 1   | Sweden    | Stockholm  |
| 2   | Sweden    | Stockholm  |
| 3   | Sweden    | Lund       |
| 4   | Sweden    | Lund       |
| 5   | Germany   | Berlin     |
| 6   | Germany   | Berlin     |
| 7   | Germany   | Hamburg    |
| 8   | Germany   | Hamburg    |

请注意 Countrycity 行中如何有重复的值。

在我的 PDO 查询中使用GROUP BY Country, City,这些值在循环中不会重复。这是用于此目的的 PDO:

$query = "SELECT id, city, country FROM table GROUP BY country, city";
$stmt = $db->query($query);
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) :

上面的代码将产生这样的输出(中间进行一些编辑)。 GROUP BY 有效,但 country 重复:

Sweden - Stockholm
Sweden - Lund
Germany - Berlin
Germany - Hamburg

使用 Bootstrap 折叠和上面的代码,我通过一个简单的下拉折叠将国家城市分开。这是代码:

<li>
<a data-toggle="collapse" data-target="#<?= $row['id']; ?>" 
href="search.php?country=<?= $row['country']; ?>">
<?= $row['country']; ?>
</a>

<div id ="<?= $row['id']; ?>" class="collapse in"> //collapse div here 
<a href="search.php?city=<?= $row['city']; ?>">
<?= $row['city']; ?><br></a>
</div> //end
</li>   

它看起来像这样(一旦开始崩溃):

Sweden 
> Stockholm
Sweden
> Lund
Germany
>Berlin 
Germany
>Hamburg

这就是我遇到问题的地方。上面列出了值 SwedenGermany 2 次。我希望瑞典德国只列出一次,以及下面列出的城市,所以所需的外观是这样的:

Sweden // Lists one time
> Stockholm
> Lund
Germany // Lists one time
>Berlin 
>Hamburg

我尝试过使用DISTINCT、GROUP_CONTACT和其他方法,但没有一个得到我想要的输出(上面)。建议?以下是我当前的完整代码:

<?  
$query = "SELECT id, city, country FROM table GROUP BY country, city";
$stmt = $db->query($query);
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) :

?>
<li>
    <a data-toggle="collapse" data-target="#<?= $row['id']; ?>" 
    href="search.php?country=<?= $row['country']; ?>">
    <?= $row['country']; ?>
    </a>

    <div id ="<?= $row['id']; ?>" class="collapse in"> //collapse div here 
    <a href="search.php?city=<?= $row['city']; ?>">
    <?= $row['city']; ?><br></a>
    </div> //end
    </li>       
        <?  endwhile ?>     

最佳答案

所以,正如所讨论的,你的 mysql 结果不是问题。你有一些逻辑需要改变。 我没有要检查的环境,如果不起作用,请告诉我。

$currCountry = "";
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) :
?>
<li>
    <?if ( $currCountry != $row['country'] ) {?>
        <a data-toggle="collapse" data-target="#<?= $row['id']; ?>" 
         href="search.php?country=<?= $row['country']; ?>">
         <?= $row['country']; ?>
         </a>
    <?
    }
    $currCountry = $row['country'];
    ?>

<div id ="<?= $row['id']; ?>" class="collapse in"> //collapse div here 
<a href="search.php?city=<?= $row['city']; ?>">
<?= $row['city']; ?><br></a>
</div> //end
</li>       
<?  endwhile ?>  

关于php - 列表问题,GROUP mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19626632/

相关文章:

sql - 两个表的并集 - 两个表的交集

sql - ActiveRecord 查询返回对象两次(同一对象的 2 个实例)

mysql从其他表中选择id和name并加入查询

php - pdo 准备转义单引号

php - 每 5 秒从 MYSQL 表中读取一次,并在 PHP 页面上动态显示结果而不刷新

PHP PDO MySQL 插入错误,但可以在 MySQL 上直接查询

mysql - 当我添加分页排序时,Symfony 创建了错误的 SQL

php - 拉维尔 : Having lot of problems converting SQL query to query builder

javascript - 如何将图像从主页发送到另一个?

php - 下载一个用 PHP 强制作为附件的文件