【问题标题】:mysql query is producing more results than it shouldmysql 查询产生的结果超出预期
【发布时间】:2010-03-19 00:05:42
【问题描述】:
SELECT S.CLIENT,S.IP_DOMAIN as IP, IFNULL(K.DATE, DATE '0000-00-00') AS RecentDate
      FROM PLD_SERVERS AS S JOIN PLD_SEARCHES AS K ON S.ID = K.SERVER_ID

此查询将产生与 PLD_SEARCHES 中的条目一样多的结果。例如:

我在 PLD_SERVERS 中有 3 个条目,在 PLD_SEARCHES 中有 18 个条目。此查询的输出将为 18,但我需要它为 3(作为 PLD_SERVERS 条目的数量),最近日期作为 PLD_SEARCHES 的连接字段。

【问题讨论】:

    标签: sql mysql mysqli


    【解决方案1】:

    怎么样:

    SELECT S.CLIENT,S.IP_DOMAIN as IP
        , IFNULL(
            (
            Select Max(K2.DATE)
            From PLD_SEARCHES AS K1 
            Where S.ID = K1.SERVER_ID
            ), DATE, '0000-00-00') AS RecentDate
    FROM PLD_SERVERS AS S 
    Where Exists(   
                Select 1
                From PLD_SEARCHES AS K1 
                Where S.ID = K1.SERVER_ID
                )
    

    这里我使用 Exists 函数来确定要显示哪些行,然后我使用第二个子查询来查找最后一个日期。

    【讨论】:

    • 不工作...如果 PLD_SERVERS.ID = PLD_SEARCHES.SERVER_ID 成立,我需要从 PLD_SERVERS 中全选,然后加入 PLD_SEARCHES 中具有最新日期的列
    • 得到它的工作谢谢。我需要修改一些参数和一个逗号:)
    【解决方案2】:

    尝试使用左连接:

       SELECT  S.CLIENT,S.IP_DOMAIN as IP, IFNULL(K.DATE, DATE '0000-00-00') AS RecentDate
         FROM  PLD_SERVERS AS S 
    LEFT JOIN  PLD_SEARCHES AS K ON S.ID = K.SERVER
    

    对于这种情况,问题可能源于不正确的 JOIN 类型。检查不同类型的连接:

    1. http://en.wikipedia.org/wiki/Join_%28SQL%29
    2. http://www.wellho.net/mouth/158_MySQL-LEFT-JOIN-and-RIGHT-JOIN-INNER-JOIN-and-OUTER-JOIN.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      相关资源
      最近更新 更多