我刚刚浏览了我的应用程序中的一些日志,并且发现了一个写得很糟糕的查询(由我编写)并且它经常被执行。该查询与子查询具有组连接的几个连接。
我尝试优化这个查询,并且我有一些在性能上更好的多倍,并且真的有助于我们的应用程序。
SELECT table1.*, GROUP_CONCAT(table2.gid) as gids, GROUP_CONCAT(table3.items) as items from table1 LEFT JOIN table2 using (ID) LEFT JOIN table3 USING (ID) WHERE table1.Status != 4 AND table1.ID = <insert_an_id> group by ID;
当我使用table1.ID执行此查询作为不存在的ID时,MySQL返回一个带有所有NULL的行的结果集,这真的很奇怪。它怀疑这是由于小组会议,但由于我的MySql知识有限,我无法确定。当我不在ID上过滤它时它工作正常。
要解决此问题,我在此查询中添加了一个HAVING子句。
HAVING table1.ID IS NOT NULL
现在, MySql返回一个空集,但我注意到JDBC返回一行的结果集。此行中的所有元素都是Null。由于我使用Spring,我希望NamedParameterJDBCTemplate抛出EmptyResultSet异常。我使用的是JDBC 4,MySql 5.5.39和Java 6.
如果我能提供更多信息,请告诉我。提前感谢一堆。
编辑:来自GreyBreardedGeek&#39;的建议暂时解决了我的问题。我是多么愚蠢地想念这个小组。 然而,尽管MySql返回一个空集,它仍然听起来像JDBC中的一个非常模糊的行为。如果有人能够提供有关我为什么会看到这种行为的有效解释,那就太棒了。谢谢。