Sql SELECT group by和order

时间:2014-12-14 10:55:44

标签: mysql sql twitter-bootstrap

mI有一个包含2列的数据库,CITY和REGION。我想填充表单选择输入并按区域分组。

我正在使用Bootstrap 3,我想将optgroup添加到选择输入中,包含我所拥有的每个地区的区域名称,以及所有要遵循的城市,如果这有意义的话。

这样的事情:



<optgroup label="region 1">
	<option>city 1</option>
	<option>city 2</option>
	<option>city 3</option>
	<option>......</option>
</optgroup>
<optgroup label="region 2">
	<option>city 1</option>
	<option>city 2</option>
	<option>city 3</option>
	<option>......</option>
</optgroup>
<optgroup label="region 3">
	<option>city 1</option>
	<option>city 2</option>
	<option>city 3</option>
	<option>......</option>
</optgroup>
&#13;
&#13;
&#13;

问题是:我应该如何选择sql来获得我想要的东西?  并按字母顺序排列,区域和城市。

1 个答案:

答案 0 :(得分:0)

一种方法是使用 group_concat()

select 
region,
group_concat(city order by city) as cities
from table_name 
group by region
order by region

以上查询将为您提供所有区域名称和城市,以逗号分隔的内容为

region1 city1,city2,city3
.....

因此,当您遍历记录时,您可以拥有regionname,然后将逗号分隔的城市拆分为数组,并通过循环遍历数组可以生成选项。

在PHP中,它可以作为

完成
$conn = new PDO('mysql:host=localhost;dbname=your_db_name', 'user_name', 'password');
$qry = 'select 
    region,
    group_concat(city order by city) as cities
    from table_name 
    group by region
    order by region';
$stmt = $conn->prepare($qry);
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
   echo '<optgroup label="'.$row['region'].'">';
   $cities = explode(",",$row['cities']);
   foreach($cities as $city){
    echo '<option>'.$city.'</option>';
   }
   echo '</optgroup>';
}