php - 使用 php 连接两个 MySQL 表并对结果进行分组

标签 php mysql html-table

我有以下代码来填充表中的城市。

$cities_query = "SELECT city_name FROM city_selection";
$cities_result = mysql_query($cities_query);


echo "<table>";
while ($row = mysql_fetch_assoc($cities_result))
{
    echo "<tr>";
    echo "<td>".$row['city_name'] . "</td>";
    echo "</tr>";
}
echo "</table>";

现在我需要按地区对每个城市进行分组,因此我创建了名为 city_region_selection 的表并添加了Foreign key来自新专栏"region_id"city_selection tableregion_id在新表中。

我现在正在努力使用 PHP 在一个漂亮的 html 表格中呈现这些数据。

是否可以先用region_name填充表行,然后再填充一些包含该区域城市的子行?详情请参阅此图片:

http://oi48.tinypic.com/2uq0z9x.jpg

最佳答案

你只需要做一些预处理:

/* SQL
   SELECT
      city_name,
      region_name
   FROM
      city_selection
      NATURAL JOIN city_region_selection
SQL */

$regions = array();
while ($result->fetch()) {
   if (!isset($regions[$result->region_name])) {
      $regions[$result->region_name] = array();
   }
   $regions[$result->region_name][] = $result->city_name;
}

以 SQL 为焦点的替代方法

/* SQL
   SELECT
      region_name,
      GROUP_CONCAT(city_name SEPARATOR ',') cities
   FROM
      city_selection
      NATURAL JOIN city_region_selection
   GROUP BY
      region_name
*/

$regions = array();
while ($result->fetch()) {
   $regions[$result->region_name] = explode(',', $result->city_name);
}

帮助

请注意,while 语法只是被删节了。您可能会将其替换为

while ($row = mysql_fetch_assoc($cities_result)) {
   $regions[$row['region_name']] = explode(',', $row['city_name']);
}

...例如

一旦构建了regions,只需执行以下操作:

foreach ($regions as $region => $cities) {
   echo "<tr><td>$region</td></tr>";
   foreach ($cities as $city) {
      echo "<tr><td class="tabbed">$city</td></tr>";
   }
}

关于php - 使用 php 连接两个 MySQL 表并对结果进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10688338/

相关文章:

javascript - PHP in JavaScript 集成代码

php - 使用 Web 服务的 Codeigniter 分页

mysql - 如何在rails中进行mysql表分区?

mysql - SQL 连接不工作(或非常慢)

jquery - 如何使用 Jquery 复制表的第一行?

php - Magento 2 的产品图片和缩略图显示行为

转义文字 <?php 和 <?在 PHP 脚本中

java - Tomcat JDBC 连接池 - 连接卡在 Activity 状态

php - HTML 表无法正确显示 MySQL 数据

javascript - 隐藏特定表的第 n 个子级