0

このクエリの何が問題になっているのかわかりません。特定のジャンルで検索したいのですが、このクエリで他のジャンルの結果が表示されます。本当に助けが欲しいです。このコードは、phpで構築された私の最初のサイト用です。

SELECT * 
FROM news
WHERE (titel LIKE '%keyword%') AND genre='politics'
4

1 に答える 1

2

まず、MySQL のパターン マッチングについて調べてみることをお勧めします。ドキュメントのリンクは次のとおりです。http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html

SQL パターン マッチングでは、「_」を使用して任意の 1 文字と一致させ、「%」を使用して任意の数の文字 (0 文字を含む) と一致させることができます。MySQL では、SQL パターンはデフォルトで大文字と小文字を区別しません。ここにいくつかの例を示します。SQL パターンを使用する場合は、= または <> を使用しません。代わりに LIKE または NOT LIKE 比較演算子を使用してください。

「b」で始まる名前を検索するには:

mysql> SELECT * FROM pet WHERE name LIKE 'b%';
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

「fy」で終わる名前を検索するには:

mysql> SELECT * FROM pet WHERE name LIKE '%fy';
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

「w」を含む名前を検索するには:

mysql> SELECT * FROM pet WHERE name LIKE '%w%';
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

正確に 5 文字を含む名前を検索するには、「_」パターン文字の 5 つのインスタンスを使用します。

mysql> SELECT * FROM pet WHERE name LIKE '_____';
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

変更されたクエリ

したがって、クエリで NEWS テーブルから行を選択し、TITLE がキーワードのようなもので、GENRE が特定の文字列に等しいすべてのものを選択する必要があります。

以下は、クエリをどのように構成するかです。このクエリにはパフォーマンスに関する考慮事項はありませんが、これが大きなテーブルで頻繁に行われるクエリである場合は、インデックスやその他のパフォーマンス エンハンサーを調査することをお勧めします。

もともと、あなたは使用しています:

SELECT * FROM news WHERE (title LIKE '%keyword%') AND genre='politics'

オプション1:

SELECT *
FROM news
WHERE
title LIKE '%keyword%'
AND
genre = 'politics';

オプション 2:

クエリにフィールドを挿入する前に、入力がどこから来ているか、フィールドをパラメーター化する必要があるかどうかを検討する必要があります。パラメーターを使用すると、コードがよりクリーンで柔軟になり、セキュリティと型チェックが提供されます。

このようなことを試してください。このコードはテストされていないため、構文の問題がある可能性がありますが、近いはずです。

private string title = "%title%";
private string genre = "genre";

using (MySqlConnection con = new MySqlConnection(connectionString))
{
  using (MySqlCommand cmd = new MySqlCommand())
  {
    cmd.Connection = con;
    cmd.CommandText 
      = "SELECT * FROM NEWS WHERE TITLE LIKE '@title' AND GENRE = @genre; ";
    cmd.Parameters.AddWithValue("@title", title);
    cmd.Parameters.AddWithValue("@genre", genre);
    using (MySqlDataReader drd = cmd.ExecuteReader())
    {
      while (drd.Read())
      {
        // Read from data reader
      }
    }
  }
}
于 2012-10-31T03:40:50.840 に答える