DISTINCT çoklu alan arama SEÇ?

2 Cevap php

Ben kullanıcı tarafından tek bir değeri girişi karşı eşleşen, birden çok alanı (zc_city, zc_zip ve zc_state) aramak çalışıyorum. Üç sütun sonuçlarına dahil edilmelidir. İşte şimdi ne var:

$q = strtolower($_GET["q"]);
if (!$q) return;

$sql = "SELECT DISTINCT zc_city AS zcity FROM search_zipcodes WHERE zc_city LIKE '$q%'";

$rsd = mysql_query($sql);
while($rs = mysql_fetch_array($rsd)) {
    $zcity = $rs['zcity'];
    echo "$zcity\n";
}

Bu tablo, aşağıdaki yapıya sahiptir:

CREATE TABLE search_zipcodes (
  zc_zip VARCHAR(5),
  zc_lat FLOAT,
  zc_lon FLOAT,
  zc_city VARCHAR(80),
  zc_state CHAR(2) 
);

2 Cevap

, En az bir sütun için bir maç var satırları döndürmek kullanmak için OR:

SELECT zc_city AS city, zc_state AS state, zc_zip AS zip
  FROM search_zipcodes
  WHERE zc_city LIKE :city OR zc_zip=:zip

Hazırlanmış bir sorgu gibi, bu gibi görünüyor:

// connect to the DB. Should be in its own function to isolate credentials.
$db = new PDO(...);

// get the cities. Should be in a function/method to access DB (the data access layer).
$findPlace = $db->prepare("SELECT zc_city AS city, zc_state AS state, zc_zip AS zip
      FROM search_zipcodes
      WHERE zc_city LIKE :city OR zc_zip=:zip");
$places = $findPlace->execute(array(':city' => $_REQUEST['q'] . '%', 
                                    ':zip' => $_REQUEST['q']));

// display places. Should be in a method of a view class.
?>
  <ul>
    <?php foreach ($places as $place) {
       echo "<li>$place[city], $place[state] $place[zip]</li>\n";
    } ?>
  </ul>

Yorumlarla tarif üç farklı görevler vardır unutmayın. Her ayrı bir katmana (örneğin Model-View veya Model-View-Controller olarak mimari tabaka) üçüncü gelen (veri erişim katmanı) ilk ikisi ile ayrı bir sınıfa ait olmalıdır.

Sadece bir ameliyathaneye soran sanki sesler:

$sql = "SELECT zc_city, zc_state, zc_zip FROM search_zipcodes WHERE zc_city LIKE '$q%' OR zc_state LIKE '$q%' OR zc_zip LIKE '$q%' ";

Ben hala bu masada ne birincil anahtar belirttiğimiz emin değilim. Bu Zip veya Zip + Şehir olsaydı, o zaman kullanmaya gerek olmazdı DISTINCT. Eğer aynı şehir, eyalet ve zip için birden çok giriş olabilir, o zaman bir GROUP BY şöyle kullanabilirsiniz:

$sql = "SELECT zc_city, zc_state, zc_zip FROM search_zipcodes WHERE zc_city LIKE '$q%' OR zc_state LIKE '$q%' OR zc_zip LIKE '$q%' GROUP BY zc_city, zc_state, zc_zip ";

EDIT bir sorgudan sonuç alma hakkında daha fazla bilgi aramak, ancak böyle bir şey deneyebilirsiniz:

while ( $rs = mysql_fetch_assoc($rsd) ){
    $array[] = $row;
}

Veya

Bu sütun değerleri bir dizi olma dizinin her girişi ile bir diziye sonuçları maddeleri ve her zaman boş olacaktır sonuncusu düşer.

while ( ($resultArray[] = mysql_fetch_assoc($rsd) ) || array_pop( $resultArray ) );