3

正しい MYSQL データベースをスキャンしてキーワードを検索し、a) 一緒に、または b) 別々にそれらを返す 2 つのクエリがあります。「ランク」と呼ばれる新しい列を追加しました。これは、それらを順番にランク付けします。各クエリに「ORDER BY rank」を追加し、1 つの用語を入力すると結果が正しく表示されますが、2 つ以上の用語を入力すると次のエラーが発生します: MySQL クエリ エラー: SQL 構文にエラーがあります; 1 行目の「ORDER BY rank」付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。結果は自動的に ID によってランク付けされます。1 つのクエリから ORDER BY タグを削除すると、他のクエリのタグが機能しなくなります。理解できません?私の質問は以下です。

    // Terms Together
    $query = " SELECT * FROM scan WHERE "; 

$terms = array_map('mysql_real_escape_string', $terms);
$i = 0; 
foreach ($terms as $each) {
      if ($i++ !== 0){
            $query .= " AND ";
      }
      $query .= "keywords LIKE '%{$each}%' ORDER BY rank";
}

            /* Query Statement Building - Terms Separate */
    $query = " SELECT * FROM scan WHERE "; 

    $terms = array_map('mysql_real_escape_string', $terms);
    $i = 0; 
    foreach ($terms as $each) {
          if ($i++ !== 0){
                $query .= " OR "; 
          }
          $query .= "keywords LIKE '%{$each}%' ORDER BY rank";
    }
4

1 に答える 1

7

ORDER BY、ループ内ではなく、ループの最後に来る必要があります。そうしないとORDER BY、クエリごとに複数のステートメントが取得されますが、これは無効です。

foreach ($terms as $each) {
      if ($i++ !== 0){
            $query .= " OR "; 
      }
      $query .= "keywords LIKE '%{$each}%'";
}
// Don't append the ORDER BY until after the loop
$query .= " ORDER BY rank";

現在持っているものではなく、このパターンを使用するように両方のループを変更します。

于 2012-08-12T11:49:03.977 に答える