SQL IF 和 LEFT JOIN 导致数据库出现故障

Posted

技术标签:

【中文标题】SQL IF 和 LEFT JOIN 导致数据库出现故障【英文标题】:SQL IF and LEFT JOIN cause database to malfunction 【发布时间】:2011-06-21 10:31:04 【问题描述】:

我刚刚遇到了一个以前从未遇到过的问题。当我在 phpmyadmin 中尝试我的 SQL 语句时,一切都很好。但是,一旦我在带有 mysql 的 c 应用程序中使用它,它只能在每隔一个开始时工作。此外,当我运行一次时,它会阻塞整个表,然后该表不返回任何结果,即使在 phpmyadmin 中也不返回。

SQL如下:

    SELECT watchedItems.aid, IF((watchedItems.maxBidPrice > 0.00), watchedItems.maxBidPrice, bidGroups.bidGroupPrice)   
AS maxBidPrice 
FROM watchedItems 
LEFT JOIN bidGroups ON bidGroups.bidGroupID = watchedItems.bidGroupID 
WHERE watchedItems.sniping = 1 
AND watchedItems.deleted = 0 
AND watchedItems.PID = 0 
AND watchedItems.processRunning = 0 
AND watchedItems.id = 1

在 WHERE 过滤掉所有内容之前,LEFT JOIN 会用 NULL 填充所有内容,这会以某种方式影响表(NULL 指针)吗?还是 IF 语句放错了位置?或者可能是左连接有问题?奇怪的是,如果我修改代码并且只使用:

  SELECT watchedItems.aid, IF((watchedItems.maxBidPrice > 0.00), watchedItems.maxBidPrice, bidGroups.bidGroupPrice)   
AS maxBidPrice 
FROM watchedItems 
LEFT JOIN bidGroups ON bidGroups.bidGroupID = watchedItems.bidGroupID 
WHERE 
watchedItems.id = 1

至少从表面上看,一切似乎都有效——我没有遇到桌子堵塞的情况。也许我在这里仍然遗漏了一些东西。

【问题讨论】:

我会说它与您的 C 代码有关。那么你能发布你用来从查询中提取的代码吗? 我认为你可能是对的。我现在尝试了几种解决方案,但似乎没有任何效果。 你认为我应该将它单独发布在一个新线程中吗? 通过phpMyAdmin运行查询时,数据是否正确?看起来您可能会返回太多数据,这就是问题所在,而不是“如果”。为了验证这一点,您可以运行相同的连接/位置,但选择 * 而不是 IF 子句? 【参考方案1】:

试试这个

SELECT watchedItems.aid, IF((bigGroups.bigGroupID IS NOT NULL AND watchedItems.maxBidPrice > 0.00), watchedItems.maxBidPrice, bidGroups.bidGroupPrice)   

> 0.00 不保证有来自 bigGroups 的数据。

【讨论】:

【参考方案2】:

确保 where 子句和maxBidPrice 中的所有列都有索引,否则请求将非常昂贵。 (在 phpMyAdmin 表结构视图中除了列之外还有一个按钮。)

它可以在 phpMyAdmin 中工作,因为它会默默地将limit 50 添加到 sql 代码中。

如果maxBidPrice可以为null,则可以使用COALESCE

IF((COALESCE(watchedItems.maxBidPrice, 0.00) > 0.00),
    watchedItems.maxBidPrice, bidGroups.bidGroupPrice)

如果maxBidPrice 不为 NULL,则始终 >0,请使用 IFNULL

IFNULL(watchedItems.maxBidPrice, bidGroups.bidGroupPrice)

【讨论】:

谢谢,我已禁用 maxBidPrice 为 NULL。默认值为 0.00

以上是关于SQL IF 和 LEFT JOIN 导致数据库出现故障的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句中LEFT JOIN和RIGHT JOIN 以及INNER JOIN的区别

关于SQL 查询效率问题 left join 改成 inner join union

SQL中LEFT JOIN 和 inner join 的区别

MySql 之 left join 查询结果

Sql Left Join if Where 不存在

SQL Left Join 仅第一个匹配项