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

时间:2011-06-21 10:31:04

标签: mysql sql c left-join

我刚刚遇到了一个前所未有的问题。当我在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声明是否错位?或者LEFT JOIN可能有问题?奇怪的是,如果我调整代码并且只使用:

  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
一切似乎至少在表面上起作用 - 我没有得到表格堵塞。也许我现在还在遗漏一些东西。

2 个答案:

答案 0 :(得分:0)

试试这个

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

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

答案 1 :(得分:0)

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

它在phpMyAdmin中工作,因为它以静默方式将limit 50添加到sql代码中。

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

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

如果maxBidPrice总是> 0,如果不是NULL,请使用IFNULL

IFNULL(watchedItems.maxBidPrice, bidGroups.bidGroupPrice)