このクエリの何が問題になっているのかわかりません。特定のジャンルで検索したいのですが、このクエリで他のジャンルの結果が表示されます。本当に助けが欲しいです。このコードは、phpで構築された私の最初のサイト用です。
SELECT *
FROM news
WHERE (titel LIKE '%keyword%') AND genre='politics'
まず、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
}
}
}
}