我使用带有count和IN条件的子查询的SQL查询:
SELECT *
FROM table1
INNER JOIN table2 USING (field1)
WHERE table2.field2 > NOW()
AND (
SELECT count(*) FROM view
WHERE view.field3 = table1.field3
AND view.field4 IN (1,7,12,18)
) <> table1.field6
在将view
表替换为VIEW之前,一切正常。
现在,我得到table1 join table2
中匹配table2.field2 > NOW()
的所有行。第二个条件似乎总是有效。
我必须用OR替换IN条件才能使其正常工作
SELECT *
FROM table1
INNER JOIN table2 USING (field1)
WHERE table2.field2 > NOW()
AND (
SELECT count(*) FROM view
WHERE view.field3 = table1.field3
AND (view.field4 = 1 OR view.field4 = 7 OR view.field4 = 12 OR view.field4 = 18)
) <> table1.field6
我做错了吗?它是MariaDB的错误吗?有什么解决方案吗?
非常感谢
修改
这是EXPLAIN SELECT
(它们对于两个查询完全相同):
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY table2 range PRIMARY,field2 field2 8 NULL 1927 Using index condition
1 PRIMARY table1 ref PRIMARY PRIMARY 4 bddname.table2.field1 1 Using where
2 DEPENDENT SUBQUERY table3 ref PRIMARY,field3,field4 field3 4 bddname.table1.field3 72 Using where
2 DEPENDENT SUBQUERY table4 eq_ref PRIMARY PRIMARY 4 bddname.table3.field5 1 Using index
这是CREATE VIEW
:
CREATE ALGORITHM=UNDEFINED DEFINER=`****`@`******` SQL SECURITY DEFINER VIEW `view`
AS SELECT
`table4`.`field5` AS `field5`,
`table3`.`field3` AS `field3`,
`table3`.`field4` AS `field4`,
--... some other fields
FROM (`table4` join `table3` on((`table4`.`field5` = `table3`.`field5`)))
MariaDB服务器是一个包含4台服务器的集群。