【问题标题】:Doubts about queries in MySQLMySQL中查询的疑问
【发布时间】:2011-11-25 17:37:42
【问题描述】:

我想用 Rails 进行查询,如下所示:

filters = Filter.joins(:category_filters).where("category_id IN (?)", params[:categories]).group("filters.id")

MySQL 的语句是这样的:

SELECT `filters`.* FROM `filters` INNER JOIN `category_filters` ON `category_filters`.`filter_id` = `filters`.`id` WHERE (category_id IN ('9,4')) GROUP BY filters.id

乍一看,这个查询没问题,但是当我查看结果时,它是错误的。让我解释一下。

首先,这是对表过滤器的查询:

select * from filters;

+----+----------+-------+----------+------------+------------+
| id | name     | other | optional | created_at | updated_at |
+----+----------+-------+----------+------------+------------+
|  1 | material |     1 |        1 | NULL       | NULL       |
|  2 | abc      |     1 |        0 | NULL       | NULL       |
|  3 | xyz      |     0 |        0 | NULL       | NULL       |
|  4 | 123a     |     0 |        0 | NULL       | NULL       |
+----+----------+-------+----------+------------+------------+

其次,这是对表 category_filters 的查询:

select * from category_filters;

+----+-----------+-------------+------------+------------+
| id | filter_id | category_id | created_at | updated_at |
+----+-----------+-------------+------------+------------+
|  1 |         1 |           1 | NULL       | NULL       |
|  2 |         2 |           1 | NULL       | NULL       |
|  3 |         1 |           9 | NULL       | NULL       |
|  4 |         2 |           9 | NULL       | NULL       |
|  5 |         1 |           4 | NULL       | NULL       |
|  6 |         3 |           4 | NULL       | NULL       |
+----+-----------+-------------+------------+------------+

现在,Rails 生成的查询(第一个查询):

SELECT `filters`.* FROM `filters` INNER JOIN `category_filters` ON `category_filters`.`filter_id` = `filters`.`id` WHERE (category_id IN ('9,4')) GROUP BY filters.id;

+----+----------+-------+----------+------------+------------+
| id | name     | other | optional | created_at | updated_at |
+----+----------+-------+----------+------------+------------+
|  1 | material |     1 |        1 | NULL       | NULL       |
|  2 | abc      |     1 |        0 | NULL       | NULL       |
+----+----------+-------+----------+------------+------------+

为什么会这样?

但是现在,这是类似的查询,而不是使用 IN 我使用 OR,像这样:

SELECT `filters`.* FROM `filters` INNER JOIN `category_filters` ON `category_filters`.`filter_id` = `filters`.`id` WHERE (category_filters.category_id=9 or category_filters.category_id=4) GROUP BY filters.id;

+----+----------+-------+----------+------------+------------+
| id | name     | other | optional | created_at | updated_at |
+----+----------+-------+----------+------------+------------+
|  1 | material |     1 |        1 | NULL       | NULL       |
|  2 | abc      |     1 |        0 | NULL       | NULL       |
|  3 | xyz      |     0 |        0 | NULL       | NULL       |
+----+----------+-------+----------+------------+------------+

发生了什么?

【问题讨论】:

    标签: mysql ruby-on-rails database inner-join


    【解决方案1】:

    在你的 WHERE 子句中,试试这个(假设 category_id 是一个数字):

    category_id IN (9,4)
    

    else this(假设 category_id 是一个字符串)

    category_id IN ('9','4')
    

    而不是这个(在您的原始查询中)

    category_id IN ('9,4')
    

    【讨论】:

      【解决方案2】:

      如果你这样做

      where(:category_id => params[:categories]
      

      Rails 将为您创建正确的 SQL 语法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-29
        • 1970-01-01
        • 2011-03-20
        • 2012-09-20
        • 2023-03-29
        • 2019-11-11
        • 2011-08-26
        相关资源
        最近更新 更多