2011-09-08 72 views
1

我有一个项目的每个状态的搜索框!这是做mysql查询的正确方法

当我搜索时,这是正确的方法吗?

SELECT * 
FROM (`site_pages`) 
WHERE `title` LIKE '%php%' 
OR `content` LIKE '%php%' 
HAVING `status` != 'deleted' 
AND `status` != 'concept' 

如果没有搜索致力于我只是用

... WHERE'status' != 'deleted' AND 'status' != 'concept' 

回答

4

一些改进可能:

  • 没有理由使用having,你应该简单地追加额外where条件。

  • 您可以创建一个statuses表,为删除的/概念值分配数字表示,允许您轻松更改状态的名称添加/枚举所有现有状态。这减少了存储许多冗余文本字段的开销,并大大提高了与状态字段比较的速度,数字比较比字符串比较快得多。

  • 您也可能希望将“已删除”状态放入每条记录的列中。就目前而言,记录可以是概念或删除,但不是被删除的概念。如果你想取消删除一个记录怎么办?您已经失去了预先删除的状态。这是通常如何非破坏性地删除记录的方式;要么通过激活deleted位,要么取消激活active位。

否则它看起来像很标准的SQL。

+0

你的权利!我看着这一切都错了。我将为删除和概念状态制作单独的论坛。谢谢 –

2

HAVING用于聚合查询(即使用GROUP BY的查询)。你最后的两个条件应该合并到你的WHERE区块。此外,我不认为你需要围绕表名称的括号。

您会发现随着数据的增长,使用LIKE这样的功能可能表现不佳,但您使用它的方式没有任何合成错误。