Bir iki tablo JOIN yok sorguda MySQL GROUP BY kullanarak Sorunları

2 Cevap php

Ben iki MySQL tablo, $ database1 ve $ database2 var. Hem ID adında onları bir alan var. Ben GET (yani bu kodu tutan PHP dosyasının URL bulunuyor) kullanarak dosyaya bir şehrin adını geçirerek.

Ben bu sorguyu çalıştırabilirsiniz ...

$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 vardır 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>';

... Ve nasıl çalıştığını ve tüm iyi. Şu vea çıktı bu gibi görünüyor ...

People who vardır searching for Hogwarts:

  • ID # 137: Hermione Granger - Stern arıyor
  • ID # 137: Hermione Granger - Engelberg arıyor
  • ID # 503: Harry Potter - Kreindler Kimler arıyor
  • ID # 549: Ron Weasley - Kreindler Kimler arıyor
  • ID # 1062: Draco Malfoy - Engelberg arıyor
  • ID # 1155: Ginny Weasley - Kreindler Kimler arıyor
  • ID # 1155: Ginny Weasley - Streisve arıyor

Ama çıkış ihtiyaçları verdiği, ve ben değişiklikleri yansıtmak için benim SQL sorgu ifadesi yazıyor sorun yaşıyorum. Çıkış bu gibi bakmak için ben gerçekten ne istiyorum ...

People who vardır searching for Hogwarts:

  • Engelberg (id # 137) Hermione Granger tarafından arveı ve Draco Malfoy (id # 1062) ediliyor
  • Kreindler Harry Potter (id # 503), Ron Weasley (id # 549), ve Ginny Weasley (id # 1155) tarafından arveı
  • Stern Hermione Granger tarafından arveı (id # 137) ediliyor
  • Streisve Ginny Weasley tarafından arveı (id # 1155) ediliyor

Diğer bir deyişle, ben alana göre gruplveırmak için çıktı gerekir 'SurnameBeingSearched', ben bir ekleme bilir nerede bir "X, Y, ve Z" çıkış biçimi (içinde arama yapan insanların adlarını listelemek gerekir virgül, gerekirse, sonuçların sayısına bağlı olarak), ve ben 'SurnameBeingSearched' alanına tarafından sonuçlarını sipariş etmek gerekir.

Yardım? Teşekkürler!

2 Cevap

Bu (SQL anlamda) bir toplama sorun değil yani adlarını listelemek gerekir. Geçerli sorgu tutun. Kodda gruplandırma yapmak zorunda gidiyoruz.

Yani bir şey gibi:

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

Ayrıca MySQL GROUP_CONCAT() function kullanmak mümkün olabilir.

Bu gibi bir şey olur ...

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() varsayılan virgülle gibi değerleri döndürür. Muhtemelen bunu ihtiyaç olarak biçimlendirme almak veya SEPARATOR anahtar kelime kullanmak için onları ayırabilirsiniz. GROUP_CONCAT(fieldname SEPARATOR '-')