【问题标题】:Sql query to select row count even when at least one value matches in column out of list of variables即使变量列表中的列中至少有一个值匹配,SQL查询也可以选择行数
【发布时间】:2015-05-25 14:53:21
【问题描述】:

我有一个名为 Kits 的表名,其中有 5 列用于 Book ISBN。

  • 因此,即使 ISBN 的至少 1 个值与用于存储 ISBN 的表格套件的 5 列(ISBN_BOOK1、ISBN_BOOK2、ISBN_BOOK3、ISBN_BOOK4、ISBN_BOOK5)中的任何一列匹配,我也想选择行。
  • 如果存在任何一个 ISBN,则返回计数。

我为此编写了一个 sql 查询,但只有当最后一个值与任何行匹配时,我才会得到行输出。在我的情况下,值为 7589765432 这是我的 sql 查询:

Select * 
  from kits k
  left 
  join kits_cstm kc
    on k.id = kc.id_c 
 where '8192933563' 
   and '8192933567' 
   and '8192933568' 
   and '8192933564' 
   and '7589765432' IN (kc.isbn_book_1_c,kc.isbn_book_2_c,kc.isbn_book_3_c,kc.isbn_book_4_c,kc.isbn_book_5_c) 
   and kc.city_c = 'BAN' 
   and kc.kit_for_c = 'SCHL' 
   and k.deleted = 0 
 ORDER 
    BY k.kit_id DESC 

【问题讨论】:

  • 很难理解。但您的结构肯定不正确 - 所有这些 AND 条件都没有正确的结构。
  • 从哪里开始......好吧,从规范化开始
  • 8192933563 等数字是 ISBN 编号,我想在列中以任何顺序选择甚至任何单个 isbn 值都已存在的记录。也可以匹配所有 5 个值.

标签: php mysql sql sugarcrm


【解决方案1】:

您不能使用“AND”将值连接到一个运算符

错误的方式:“8192933536”和“8192933567”在({array])中 正确的方法:在({array])中的“8192933536”和({array])中的“8192933567”

但我怀疑你实际上想要做的更像是:

SELECT 
      * 
FROM 
     kits k LEFT JOIN kits_cstm kc
          ON k.id = kc.id_c 
WHERE 
     ('8192933563' IN (kc.isbn_book_1_c,kc.isbn_book_2_c,kc.isbn_book_3_c,kc.isbn_book_4_c,kc.isbn_book_5_c)
      OR 
     '8192933567' IN (kc.isbn_book_1_c,kc.isbn_book_2_c,kc.isbn_book_3_c,kc.isbn_book_4_c,kc.isbn_book_5_c)
      OR 
     '8192933568' IN (kc.isbn_book_1_c,kc.isbn_book_2_c,kc.isbn_book_3_c,kc.isbn_book_4_c,kc.isbn_book_5_c)
      OR 
     '8192933564' IN (kc.isbn_book_1_c,kc.isbn_book_2_c,kc.isbn_book_3_c,kc.isbn_book_4_c,kc.isbn_book_5_c)
      OR 
     '7589765432' IN (kc.isbn_book_1_c,kc.isbn_book_2_c,kc.isbn_book_3_c,kc.isbn_book_4_c,kc.isbn_book_5_c) 
      )
AND
     kc.city_c = 'BAN' 
AND
     kc.kit_for_c = 'SCHL' 
AND
     k.deleted = 0 
ORDER BY 
     k.kit_id DESC 

【讨论】:

    【解决方案2】:

    这种语法永远不会起作用:https://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html

    'a' AND 'b' AND 'c' IN (....)
    

    将被执行为

    ('a' AND 'b') AND ('c' IN (...))
        TRUE      AND (....)
    

    您不能只为 SQL 制定自己的解析规则。

    你也应该normalize你的桌子。如果您在某个时候需要 6 个 isbn 怎么办。现在你已经改变了你的桌子。 ISBN 应该在他们自己的子表中,将您的问题简化为简单的where subtable.isbn IN ('a', 'b', ...)

    【讨论】:

      【解决方案3】:

      您应该规范化您的表格。但是,如果您对这种数据结构感到困惑,那么只需使用多个 in 语句。另外,你不想要left join,你想要一个普通的join

      Select count(*) 
      from kits k join
           kits_cstm kc
           on k.id = kc.id_c 
       where '8192933563' IN (kc.isbn_book_1_c, kc.isbn_book_2_c, kc.isbn_book_3_c, kc.isbn_book_4_c, kc.isbn_book_5_c) 
         and '8192933567' IN (kc.isbn_book_1_c, kc.isbn_book_2_c, kc.isbn_book_3_c, kc.isbn_book_4_c, kc.isbn_book_5_c) 
         and '8192933568' IN (kc.isbn_book_1_c, kc.isbn_book_2_c, kc.isbn_book_3_c, kc.isbn_book_4_c, kc.isbn_book_5_c) 
         and '8192933564' IN (kc.isbn_book_1_c, kc.isbn_book_2_c, kc.isbn_book_3_c, kc.isbn_book_4_c, kc.isbn_book_5_c) 
         and '7589765432' IN (kc.isbn_book_1_c, kc.isbn_book_2_c, kc.isbn_book_3_c, kc.isbn_book_4_c, kc.isbn_book_5_c) 
         and kc.city_c = 'BAN' 
         and kc.kit_for_c = 'SCHL' 
         and k.deleted = 0 
      ORDER  BY k.kit_id DESC 
      

      【讨论】:

        猜你喜欢
        • 2011-12-02
        • 2022-11-28
        • 1970-01-01
        • 2021-11-11
        • 1970-01-01
        • 2013-03-07
        • 2020-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多