1

タグに基づいて写真テーブルの検索を実行しようとしています。

検索語を個々のキーワードに分割し、個々のキーワードごとにテーブルを検索して、一致するものを配列にプッシュします。

$keywords = explode(' ', $keywords);
$photos = array();

// loop through each keyword
foreach($keywords as $keyword){

$row = $mysqli->query(" SELECT * FROM photos WHERE tags LIKE '%$keyword%' ");

// loop through each row result
    while( $query_result = $row->fetch_assoc() ){

        // push result to photos array
        array_push($photos, $query_result);

    }

}

ただし、これは同じテーブル行を複数回返す可能性があります。たとえば、「mod modded」を検索すると、「modded」のタグを持つ写真は両方のキーワードに一致するため、配列の先頭に 2 回プッシュされます。

行を 1 回だけ選択するようにするにはどうすればよいですか?

編集

返信ありがとうございますが、どちらもうまくいきませんでした。

$keywords = explode(' ', $keywords);
$photos = array();

// loop through each keyword
foreach($keywords as $keyword){

    $row = $mysqli->query(" SELECT * FROM photos WHERE tags LIKE '%$keyword%' ");

    // loop through each row result
    while( $query_result = $row->fetch_assoc() ){

        $dontPush = false;

        // check photos array to see if the query_result already exists
        foreach($photos as $photo){
            if($photo == $query_result){
                $dontPush = true;
            }
        }

        if($dontPush === false){
            // push result to photos array if it dodesnt already exist
            array_push($photos, $query_result);
        }

    }

}

しかし、これにより非常に多くのループが作成されるため、大きなデータベースがある場合、結果を返すのに確かに長い時間がかかりますか? より良い方法はありますか

4

3 に答える 3

1

これを試して

<?php 
$keywords = explode(' ', $keywords);
$photos = array();

$query = " SELECT * FROM photos ";

// loop through each keyword
foreach($keywords as $k => $keyword){

    if ($k==0) {
       $query .= " WHERE ";
    }

    $query .= " tags LIKE '%$keyword%' ";

    if ($k-1 < count($keywords)) {
       $query .= " OR ";
    }
}

$row = $mysqli->query( $query );
while( $query_result = $row->fetch_assoc() ){

    // push result to photos array
    array_push($photos, $query_result);

}
?>
于 2013-10-19T13:02:49.403 に答える
1

Select Distinct を試す

SELECT DISTINCT * FROM photos WHERE tags LIKE '%$keyword%'

W3 学校

または、最後に LIMIT 1 を追加して、最初の行のみを返すこともできます。

于 2013-10-19T12:55:19.697 に答える
0

興味のある人のために、私はこれを解決して、重複が返されないようにしました:

$keywords = explode(' ', $keywords);
$photos = array();
$query = " SELECT * FROM photos WHERE tags LIKE ";

// loop through each keyword
foreach($keywords as $i => $keyword){

    $query .= "'%$keyword%'";

    if($i+1 < count($keywords) ){
        $query .= " union SELECT * FROM photos WHERE tags LIKE ";
    }


}

$row = $mysqli->query( $query );

// loop through each row result
while( $query_result = $row->fetch_assoc() ){

    array_push($photos, $query_result);

}
于 2013-10-19T14:07:45.443 に答える