2

これを説明するのは本当に難しいでしょうが、皆さんを混乱させないように最善を尽くします。次の表のデザインがあります。

Mysql テーブル

問題を示すための私のmysqlFiddleは次のとおりです:http://sqlfiddle.com/#!2/1363c/1

ご覧のとおり、テーブルは正常に機能し、クエリはどのシェルターがどのサービスを提供しているかを表示していますが、この情報を Web に表示しようとすると問題が発生します。現在、次のコードを使用しています。

<?php
    echo '<p>', "<strong>Shelter id</strong>: " . $query['shelter_id'].'</p>';
    echo '<p>', "<strong>Shelter name</strong>: " . $query['shelter_name'].'</p>';
    echo '<p>', "<strong>Street</strong>: " . $query['street'].'</p>';     
    echo '<p>', "<strong>City</strong>: " . $query['city'].'</p>';    
    echo '<p>', "<strong>Postcode</strong>: " . $query['postcode'].'</p>';  
    echo '<p>', "<strong>Contact Number</strong>: " . $query['phone_number'].'</p>';  
    echo '<p>', "<strong>Location</strong> :  " . $query['location_name'].'</p>'; 
?>

しかし、私が使用しているクエリでは、すべての情報を 1 つの行に複製するつもりはなく、service_name に対して複数の行を作成するつもりだと思います。

シェルターが実行できるすべてのサービスを 1 行で返すクエリを作成することはできますか?

編集:2つの別々のクエリを実行する必要がありますか? 1 つは一般的なシェルター情報を取得し、次に別のクエリを使用してサービスを配列に返し、ページ上でそれらを実行しますか?

4

2 に答える 2

1

を使用してはGROUP_CONCATどうですか?それが行うことは、値をコンマ区切りの値に結合することです。Explode()そして、後で で使用できますPHP

SELECT  shelter_name, 
        GROUP_CONCAT(services.service_name)  service_name
FROM    shelter
        INNER JOIN shelter_service 
          ON shelter.shelter_id= shelter_service.shelter_id
        INNER JOIN services 
          ON shelter_service.service_id = services.service_id
GROUP   BY shelter.shelter_id, shelter_name
ORDER   BY shelter_name
于 2013-02-28T15:16:45.930 に答える
1
  1. GROUP_CONCAT() は、限られた数の行 (10 ~ 100) がある場合にのみ使用します。データが大きい場合、クエリが大幅に遅くなります。

  2. 2 つのクエリ (タイプ用に 1 つ、データ用に 1 つ)

  3. このクエリを保持し、結果を変更します (私のお気に入りの方法)。サーバーまたは JS ループでデータを通過し、再構築します (1 つのディメンションを追加します)。

var new_data = {};
for(var i in data)//data is your $query
{
  var row = data[i];
  //create another layer of the array (make it in 2 dimensions)
  if (typeof(new_data[row['Service_name']) == 'undefined)
     new_data['Service_name'] = [];
   //add only this kind of type data
     new_data['Service_name'].push(data);
 }
//now you can remove the data and use new_data

.4. クエリが主にサービス名でソートされていることを確認し、表示 (エコー) でループすると、現在のサービス名が表示されます。

$current_name = '';
for(...)
 //if we passed to a new service in the loop
if ($query['service_name'] != $current_name) {
   echo '<h3>'.$query['service_name'].'</h3>;//display the new service
    $current_name = $query['service_name'];
}
于 2013-02-28T15:39:56.440 に答える