【问题标题】:how to write sql query correctly with "WHERE" and "IN"如何用“WHERE”和“IN”正确编写sql查询
【发布时间】:2011-10-05 18:14:14
【问题描述】:

我想选择包含给定 ID 和给定分支的记录,所以我想出了这个查询,我想知道这是否是写这个的正确方法

我正在使用 codeigniter

$orderids = array('2', '3');
$branch = array('branch1', 'branch2');

$this->db->where_in('order_id', $orderids);
$this->db->where_in('branch', $branch);
$query = $this->db->get('tbl_order_data'); 

这使得查询

SELECT *
FROM (`tbl_m_order_collection_data`)
WHERE `order_id` IN ('2', '3')
AND `branch` IN ('branch1', 'branch2') 

我的桌子看起来像

+----+----------+-------------+-----------+
| ID | order_id | branch      | item_code |
+----+----------+-------------+-----------+
|  1 |        1 | branch1     | 4R1       |
|  2 |        1 | branch2     | 4R11      |
|  3 |        1 | branch2     | ACS20x20  |
|  4 |       *2 | branch1     | ACS20x27  |
|  5 |       *2 | branch1     | ACS20x20  |
|  6 |        1 | branch1     | ACS20x20  |
|  7 |        2 | branch2     | ACS20x27  |
|  8 |       *3 | branch2     | ACS20x20  |
+----+----------+-------------+-----------+

我正在尝试从表中获取星标记录。那么上面的查询是否有效?

【问题讨论】:

  • 看起来不错?您尝试过吗?
  • yes 似乎工作正常,但我不知道 AND 在哪里和 IN 是如何工作的。这就是为什么我想问
  • 请注意,编写的查询也将返回 ID 为 #7 的行,因为 '2' 在 (2,3) 中,而 'branch2' 在 (branch1,branch2) 中。 IN 子句相互独立。
  • 您提供的查询将选择您加星标的所有行以及第 7 行。您是否尝试获取 SELECT * FROM table WHERE (order_id = 2 AND branch = 'branch1') OR (order_id = 3 AND branch = 'branch2')(只会给您加星标的 3 行)?
  • 非常感谢,好像这就是我想要的查询

标签: php mysql codeigniter logic


【解决方案1】:

从 cmets 看来,您想知道 IN 的工作原理。

简单的答案是IN在单词之后的数组中查找单词之前声明的值

示例一:

'banana' IN ('apple','orange','banana')

结果为真。

示例二:

1234 IN ('hello','world!')

这会产生错误。

您可以阅读更多关于 IN here

AND 是一个逻辑运算符,只有当两边的语句都为真时才会产生真。像这样:

true  AND true = true

false AND true = true AND false = false

如果我们结合示例一和示例二,我们会得到:

'banana' IN ('apple','orange','banana')
AND
1234 IN ('hello','world!')

由于示例一为真,但示例二为假,这将返回为假。

【讨论】:

    【解决方案2】:

    你的WHERE 子句..

    WHERE `order_id` IN ('2', '3') AND `branch` IN ('branch1', 'branch2')
    

    ..在英文中可以读作“order_id 为 '2' 或 '3' 且其branch 为 'branch1' 或 'branch2' 的记录。”

    换句话说,大致相当于:

    WHERE (`order_id` = '2' OR `order_id` = '3')
      AND (`branch` = 'branch1' OR `branch` = 'branch2')
    

    WHERE ... IN 的优点是您可以指定许多不同的值,例如order_id IN ('2', '3', '4', '5'),您甚至可以在IN 之后放置一个SELECT(子查询),以查看该值是否“在”子查询返回的集合中。

    【讨论】:

      【解决方案3】:

      是的,这是正确的做法。不过,您可以通过将这些方法链接在一起来使其更加简洁:

      $query = $this->db
          ->where_in('order_id', $orderids)
          ->where_in('branch', $branch)
          ->get('tbl_order_data');
      

      【讨论】:

        猜你喜欢
        • 2022-11-12
        • 1970-01-01
        • 2018-09-28
        • 2011-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多