【问题标题】:SQL IF and LEFT JOIN cause database to malfunctionSQL IF 和 LEFT JOIN 导致数据库出现故障
【发布时间】: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 子句?

标签: mysql sql c left-join


【解决方案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
    猜你喜欢
    • 2021-02-25
    • 1970-01-01
    • 2011-08-22
    • 2021-01-29
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    相关资源
    最近更新 更多