Sql 查询 select 行计数,即使至少有一个值与变量列表中的列匹配
Sql query to select row count even when at least one value matches in column out of list of variables
我有一个名为 Kits 的 table 名称,其中有 5 列图书 ISBN。
- 所以我想 select 行,即使 ISBN 的至少 1 个值与 5 列中的任何一列匹配(ISBN_BOOK1,ISBN_BOOK2,ISBN_BOOK3, ISBN_BOOK4,ISBN_BOOK5) table 个套件用于存储 ISBN。
- 如果存在任何一个 ISBN,则 return 计数。
我为此编写了一个 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
该语法永远不会起作用: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 您的 table。如果你在某个时候需要 6 个 isbn 怎么办?现在你已经改变了你的table。 ISBN 应该在它们自己的 child table 中,将您的问题简化为 where subtable.isbn IN ('a', 'b', ...)
您应该规范化您的表格。但是,如果您受困于此数据结构,则只需使用多个 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
您不能使用 "AND" 将值连接到一个运算符
错误的方式:WHERE '8192933536' AND '8192933567' IN ({array])
正确的方法:WHERE '8192933536' IN ({array]) 和 '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
我有一个名为 Kits 的 table 名称,其中有 5 列图书 ISBN。
- 所以我想 select 行,即使 ISBN 的至少 1 个值与 5 列中的任何一列匹配(ISBN_BOOK1,ISBN_BOOK2,ISBN_BOOK3, ISBN_BOOK4,ISBN_BOOK5) table 个套件用于存储 ISBN。
- 如果存在任何一个 ISBN,则 return 计数。
我为此编写了一个 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
该语法永远不会起作用: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 您的 table。如果你在某个时候需要 6 个 isbn 怎么办?现在你已经改变了你的table。 ISBN 应该在它们自己的 child table 中,将您的问题简化为 where subtable.isbn IN ('a', 'b', ...)
您应该规范化您的表格。但是,如果您受困于此数据结构,则只需使用多个 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
您不能使用 "AND" 将值连接到一个运算符
错误的方式:WHERE '8192933536' AND '8192933567' IN ({array]) 正确的方法:WHERE '8192933536' IN ({array]) 和 '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