1

$database1 と $database2 という 2 つの MySQL テーブルがあります。どちらにも ID というフィールドがあります。GET を使用して町の名前をファイルに渡しています (つまり、このコードを保持する PHP ファイルの URL にあります)。

このクエリを実行できます...

$PlaceName = $_GET['townName'];
$PlaceName = mysql_real_escape_string($PlaceName);

$sql="SELECT * from $database1 LEFT JOIN $database2 on $database1.ID = $database2.ID WHERE PlaceName='$PlaceName'";
$query = mysql_query($sql);

echo '<h1>People who are searching for '.$PlaceName.':</h1>';
echo '<ul>';
while ($row = mysql_fetch_array($query)) { 
   echo "<li>ID #",$row['ID'],": ",$row['MemberPersonalName']," ",$row['MemberSurname']," -- searching for ",$row['SurnameBeingSearched'],"</li>";
   }
echo '</ul>';

...そしてそれは機能し、すべてが順調です。現在、出力は次のようになります...

ホグワーツを探している人:

  • ID #137: ハーマイオニー・グレンジャー -- スターンを探している
  • ID #137: ハーマイオニー・グレンジャー -- エンゲルバーグを探している
  • ID #503: ハリー・ポッター -- クラインドラーを探している
  • ID #549: ロン・ウィーズリー -- クラインドラーを探している
  • ID #1062: ドラコ・マルフォイ -- エンゲルバーグを探している
  • ID #1155: ジニー・ウィーズリー -- クラインドラーを探している
  • ID #1155: ジニー・ウィーズリー -- ストライサンドを探している

しかし、出力を微調整する必要があり、変更を反映するために SQL クエリ ステートメントを作成するのに問題があります。私が本当に欲しいのは、出力がこのようになることです...

ホグワーツを探している人:

  • エンゲルバーグは、ハーマイオニー・グレンジャー (id #137) とドラコ・マルフォイ (id #1062) によって捜索されています。
  • クラインドラーは、ハリー・ポッター (id #503)、ロン・ウィーズリー (id #549)、ジニー・ウィーズリー (id #1155) によって検索されています。
  • 船尾はハーマイオニー・グレンジャー (id #137) によって捜索されています
  • ストライサンドはジニー・ウィーズリー (id #1155) によって捜索されています。

つまり、「SurnameBeingSearched」フィールドで出力をグループ化する必要があり、検索を行っている人の名前を「X、Y、および Z」出力形式でリストする必要があります (追加する場所がわかっている場合)。結果の数に応じて、必要に応じてカンマを使用します)。「SurnameBeingSearched」フィールドで結果を並べ替える必要があります。

ヘルプ?ありがとう!

4

3 に答える 3

2

これが(SQLの意味での)集約の問題にならないように、名前をリストする必要があります。現在のクエリを保持します。コードでグループ化を行う必要があります。

だから次のようなもの:

$rows = array();
$last = '';
while ($row = mysql_fetch_array($query)) {
  $surname = $row['SurnameBeingSearched'];
  $id = $row['ID'];
  $name = $row['MemberPersonalName'];
  if ($last != $surname) {
    $last = $surname;
    $rows[] = array();
  }
  $rows[count($rows)-1][$id] = $name;
}
foreach ($rows as $row) {
  // now display each group of names
}
于 2009-10-18T01:11:23.300 に答える
1

GROUP_CONCAT()MySQL関数を使用できる場合もあります。

このようになります...

SELECT places_tbl.name, GROUP_CONCAT(people_tbl.name) 
FROM places_tbl 
LEFT JOIN people_tbl ON (places_tbl.id = people_tbl.id) 
GROUP BY places_tbl.id

GROUP_CONCAT()デフォルトでは、値はコンマ区切りで返されます。おそらく、それらを分割して、必要に応じてフォーマットを取得するか、SEPARATORキーワードを使用することができます。GROUP_CONCAT(fieldname SEPARATOR '-')

于 2009-10-18T01:19:13.753 に答える
0
$PlaceName = $_GET['townName'];
$PlaceName = mysql_real_escape_string($PlaceName);

// note - added order to the query
$sql="SELECT * from $database1 LEFT JOIN $database2 on $database1.ID = $database2.ID WHERE PlaceName='$PlaceName' 
      ORDER BY SurnameBeingSearched, MemberSurname, MemberPersonalName";
$query = mysql_query($sql);

echo '<h1>People who are searching for '.$PlaceName.':</h1>';
echo '<ul>';
  $cntr = mysql_num_rows($query);
  if ($cntr > 0) {
    $i = 0;
    $srchd = mysql_result($query, $i, 'SurnameBeingSearched');     
    $mbr = mysql_result($query, $i, 'MemberPersonalName');
    $mbr = $mbr . " " . mysql_result($query, $i, 'MemberSurname');     
    $mbr = $mbr . " (id #" . mysql_result($query, $i, 'ID') . ")";      
    $lin = $srchd . " is being searched by " . $mbr;
    $prev = $srchd;
    if ($cntr == 1) { 
      echo "<li>" . $lin . "</li>";            
    } else {
      for ($i = 1; $i< $cntr; $i++) {        
        $srchd = mysql_result($query, $i, 'SurnameBeingSearched');     
        $mbr = mysql_result($query, $i, 'MemberPersonalName');
        $mbr = $mbr . " " . mysql_result($query, $i, 'MemberSurname');     
        $mbr = $mbr . " (id #" . mysql_result($query, $i, 'ID') . ")";      
        if ($srchd == $prev) { // common search
          $j = $i + 1;  
          if ($j < $cntr) { // still have data
            $nxt = mysql_result($query, $j, 'SurnameBeingSearched');     
            if ($prev == $nxt) {  // another one coming -- use the comma
              $lin = $lin . ", " . $mbr;  
            } else {
              $lin = $lin . ", and " . $mbr;  // last member add the 'and' - line is done
              echo "<li>" . $lin . "</li>";
            }           
            $prev = $srchd; 
          } else { // ran out of data - need to finish the line
            $lin = $lin . ", and " . $mbr;  // last member add the 'and' - line is done
            echo "<li>" . $lin . "</li>";
        } else { // new search - need to print this line and start a new one
          echo "<li>" . $lin . "</li>";            
          $lin = $srchd . " is being searched by " . $mbr;
          $prev = $srchd;
        }  // test searched = previous
      }  // next i
    }  // only one row
  }  // cntr > 0 
echo '</ul>';

/* note: this is not tested 
   I would recommend using table1 and table2 instead of database1 and database2
   or better give the tables meaningful names
   I would use active voice instead of passive voice 
*/
于 2009-10-18T03:36:15.027 に答える