正在使用AND&对于MySQL,OR语句太糟糕了?

时间:2013-09-16 20:21:25

标签: mysql sql database

我有一个这样的帖子表:

----- POSTS -----
- id
- ..等.. - 类别1 - 类别2 - category3

可以过滤任何这些类别,我计划构建如下的SQL语句:

SELECT * 
  FROM posts 
 WHERE category1='..sth..' 
   AND category1='..sth..' 
    OR category1='..sth..' 
    OR category2='..sth..' 
    OR category3='..sth..' 
   AND category3='..sth..' 
   OR ..."

这是一种不好的做法吗?这会有性能问题吗?

编辑:我给出的查询的AND和OR语句仅作为示例。

3 个答案:

答案 0 :(得分:2)

试试这个

    SELECT * FROM posts 
    WHERE category1 in ('sth','sth')
    OR    category2 in ('sth','sth')
    OR    category3 in ('sth','sth')
   .....

答案 1 :(得分:1)

如果你的数据库设计得很好,那么这是不错的做法,实际上是选择数据的理想方式。 最好的办法是考虑如何使用数据并设计存储空间,以便轻松访问最常用的数据。 这里有很多关于数据库设计细节的帖子。

你建议的sql是荒谬的(使用括号),但我怀疑你只是想把它作为一个例子。

答案 2 :(得分:1)

一般来说,这不是不坏的做法。但是,在POSTS表中有一个类别列表,表明您可能需要规范化或重构数据库结构。我想您在问题中显示的3个类别可能具有特定的特殊含义,但您希望用更好的列名表示。

您可以使用以下结构,这样您就可以根据需要将帖子分类为多个类别。

<强>帖子

  • ID

<强>分类

  • ID

<强> POST_CATEGORIES

  • POST_ID
  • CATEGORY_ID

此结构还可将您的查询简化为:

SELECT *
  FROM POSTS
  JOIN POST_CATEGORIES
    ON POSTS.id = POST_CATEGORIES.post_id
 WHERE POST_CATEGORIES.category_id = "...sth...";