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ここで、値を取得してアコーディオンのドロップダウンに配置し、同時にそれらのエントリを繰り返さないようにしたいと考えています。これが私の現在のコードです(アコーディオン効果にブートストラップの折りたたみを使用しています):

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

私が抱えている問題は、エコーの 1 つの値のみであるため、ストックホルムのみがエコーされ、ルンドやその他の値はエコーされません。これはGROUP BY国が原因だと思うので、GROUP BY国と別の値にすることは可能ですか?

編集 (必要な HTML 出力):

Sweden 
 > Stockholm
 > Lund
Germany
 > Berlin
 > Hamburg

DISTINCT を使用すると、出力は次のようになりますが、これは私が探しているものではありません。

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

3 に答える 3

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 に答える