2015-05-25 43 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 
相關問題