1

我正在制作类似手风琴的菜单。我正在尝试GROUP BY在多个列中。我研究过,但没有运气。我将分解我当前的结构:

在我的数据库中,我有重复的country条目和city条目。结构看起来有点像这样(较小的例子):

| 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    |

使用GROUP BY我可以停止循环中相同的重复VALUE,这是我用于此的代码:

$stmt = $db->query('SELECT country FROM table GROUP BY country');

虽然这很完美。现在我想City在我的手风琴下拉菜单中抓取并放置这些值,同时不重复这些条目。这是我当前的代码(我正在使用 bootstrap collapse 来实现手风琴效果):

<ul class="retailers-list"> // list
<?php  
$stmt = $db->query('SELECT country, city FROM retailers GROUP BY country');
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) :
$country = $row['country']; 
$city = $row['city']; ?>

<li>
<a data-pjax="content" data-toggle="collapse" data-target="#<?= $country ?>" href="retailers.php?country=<?= $country ?>">
<?= $country ?></a></li> //lists all countries not repeating

<div id="<?= $country ?>"  class="collapse in">
<a data-pjax="content" href="retailers.php?city=<?= $city ?>">
<?= $city ?></a><br> // listing only 1 city at a time
</div>
<? endwhile ?>              
</ul>

我遇到的问题是它只回显一个值,所以它只会回显斯德哥尔摩,不会回显隆德或任何其他值。我想这是因为 GROUP BY country 造成的,那么 GROUP BY country 和另一个值是可能的吗?

编辑(所需的 HTML 输出):

Sweden 
 > Stockholm
 > Lund
Germany
 > Berlin
 > Hamburg

使用 DISTINCT 输出看起来像这样,这不是我要找的:

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

3 回答 3

0

只需在您的 GROUP BY 中添加城市:

SELECT country, city FROM retailers GROUP BY country, city
于 2013-10-25T13:58:11.007 回答
0

因此,您需要为每个国家/地区提供不同的关联城市列表。
如果您的结果集在城市:国家/地区的比例中不是很大,您可以使用:

SELECT country, GROUP_CONCAT(DISTINCT city) FROM retailers GROUP BY country

回显结果以查看其工作原理。

如果结果集是大城市:国家比,你可以简单地做

SELECT country, city FROM retailers GROUP BY country,city

或者

SELECT DISTINCT country, city FROM retailers ORDER BY country,city
于 2013-10-25T13:58:45.243 回答
0

好吧,我对 PDO 来说太笨了,但粗略的程序方法可能看起来像这样......

SELECT * FROM cities2;
+---------+------------+---------+---------+---------+
| city_id | city_name  | lat     | lon     | country |
+---------+------------+---------+---------+---------+
|       1 | New York   | 40.6700 | 73.9400 | US      |
|       2 | London     | 51.5072 |  0.1275 | UK      |
|       3 | Kodiak     | 45.0000 | 29.0000 | US      |
|       4 | Birmingham | 34.0000 | 45.0000 | US      |
|       5 | Birmingham | 52.2900 |  1.5400 | UK      |
+---------+------------+---------+---------+---------+

<?php
include('../testi.inc');
$query = "
SELECT DISTINCT country,city_name FROM cities2 ORDER BY country,city_name;
";

$result = mysqli_query($db,$query);
 $country = '';

 while($rows = mysqli_fetch_assoc($result)){
 if ($country == $rows['country']){
 echo  "  >".$rows['city_name']."<br>\n";
 } else {
 echo $rows['country']."<br>\n  >".$rows['city_name']."<br>\n";
$country = $rows['country'];
 }
 } // end of while loop
?>

输出:

UK<br>
  >Birmingham<br>
  >London<br>
US<br>
  >Birmingham<br>
  >Kodiak<br>
  >New York<br>
于 2013-10-25T14:41:38.200 回答