类似查询中的规范

时间:2012-10-31 03:11:34

标签: mysql sql where sql-like

我无法弄清楚这个查询有什么问题。我只是想搜索一个特定的类型,但这个查询给了我其他类型的结果。真的想要一些帮助。这段代码是我在php中构建的第一个网站。

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

1 个答案:

答案 0 :(得分:2)

首先,我建议阅读MySQL中的模式匹配。文档链接是:http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html

SQL模式匹配使您可以使用“_”匹配任何单个字符,使用“%”匹配任意数量的字符(包括零个字符)。在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       |
+----------+-------+---------+------+------------+------------+

要查找包含五个字符的名称,请使用“_”模式字符的五个实例:

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
      }
    }
  }
}