2015-05-25 45 views
1

我有一个名为Kits的表名,其中有5列用于书籍ISBN。SQL查询来选择行数,即使当至少有一个值与变量列表中的列匹配时

  • 所以我想,即使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 
+1

难以理解。但是你的结构当然是不正确的 - 所有这些和条件都没有一个合适的结构。 – Randy

+0

从哪里开始......那么,从规范化开始 – Strawberry

+0

数字就像8192933563,..等等都是ISBN号码,我想要选择记录,即使任何单一的isbn值已经存在,在任何order.all 5列值也可以匹配。 – user3424169

回答

1

不能使用“和”价值观相合一个运营商

错误的方法:其中,“8192933536” AND' ({array])AND'8192933567'IN({array])

但我怀疑你实际上试图做的是更多如:

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 
+0

这解决了我的问题... – user3424169

0

这句法是从来没有去上班: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', ...)

0

您应该规范化表格。但是,如果您坚持使用这种数据结构,那么只需使用多个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 
相关问题