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