0

我有一个这样的帖子表:

----- 帖子 -----
- id
- ..etc..
- category1
- category2
- 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 语句仅作为示例。

4

3 回答 3

2

尝试这个

    SELECT * FROM posts 
    WHERE category1 in ('sth','sth')
    OR    category2 in ('sth','sth')
    OR    category3 in ('sth','sth')
   .....
于 2013-09-16T20:24:29.917 回答
1

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

您建议的 sql 是无意义的(使用括号),但我怀疑您只是将其作为示例。

于 2013-09-16T20:26:43.637 回答
1

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

您可以使用以下结构,这将允许您将帖子分类为任意数量的类别。

帖子

  • ID

类别

  • ID

POST_CATEGORIES

  • post_id
  • 类别ID

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

SELECT *
  FROM POSTS
  JOIN POST_CATEGORIES
    ON POSTS.id = POST_CATEGORIES.post_id
 WHERE POST_CATEGORIES.category_id = "...sth...";
于 2013-09-16T20:51:20.877 回答