【问题标题】:mySQL right outer joinmySQL 右外连接
【发布时间】:2011-07-30 17:23:43
【问题描述】:

我对 SQL 很陌生,正在尝试构建一个查询:

$result = mysql_query("SELECT COUNT(*) AS s_count FROM solution RIGHT OUTER JOIN 
ON offer.oid = solution.oid ". "WHERE offer.is_solved = 0  ORDER BY offer.creation_time 
DESC LIMIT $interval_begin, $interval_end");

查询应该是像环境这样的商店中的liveticker:它需要计算所有尚未解决的报价,然后在一定的时间间隔内列出它们以反映列表的某个页面。 例如,如果每个年龄有 25 个优惠,则第 2 页将为 26-50。

谁能发现为什么输出为 0?所有的列/表都存在并且确实有测试值。

【问题讨论】:

    标签: mysql sql join outer-join


    【解决方案1】:

    查询不应该是这样的

    mysql_query("SELECT COUNT(*) AS s_count FROM solution RIGHT OUTER JOIN  offer ON offer.oid = solution.oid WHERE offer.is_solved = 0  ORDER BY offer.creation_time  DESC LIMIT".$interval_begin.",".$interval_end); 
    

    【讨论】:

    • Rahul:谢谢,这可能是问题的一部分。但是,它仍然返回 0
    • 那么我们需要有关您的数据库表的更多详细信息。
    • 两个表共享一个名为“oid”的中等 int,“offer”中有 3000 个测试条目,但“solution”中有 0 个。我们的目标是将每个“报价”的解决方案数量与“报价”本身相结合。
    • 为了进行更多测试,我将删除以ORDER ... 开头的查询部分直到最后(您不需要它们来计算行数)。
    【解决方案2】:

    查看您的问题和查询,我认为您的查询始终返回 0 的最明显原因可能是:

    1. offer 的任何记录都没有 is_solved = 0。因此,WHERE 条件offer.is_solved = 0 没有匹配的条目。您能否确认一下您的数据?

    2. offer 没有数据,因此 RIGHT JOIN 不会产生任何结果。但是正如您在您的一个 cmets 中对 Rahul 的回答所提到的,offer 中有 3000 个条目,我想这个原因不太可能。

    啊哈,还有另一个原因:你确定$interval_begin$interval_end 标记的限制和偏移设置正确吗?也许如果它们都设置为 0,则查询将始终返回 0。您可以尝试对查询进行“回显/打印”并查看它的外观吗?

    因为我不了解你的架构,这只是一个建议,我认为如果你有一个offer.is_solved 列,你不需要与solution 的 RIGHT JOIN。以下查询应该同样可以正常工作,不是吗?

    SELECT COUNT(*) AS `s_count`
    FROM `offer`
    WHERE `offer`.`is_solved` = 0
    ORDER BY `offer`.`creation_time`
    DESC LIMIT $interval_begin, $interval_end;
    

    希望对你有帮助!

    【讨论】:

      【解决方案3】:

      您在查询中需要什么解决方案表?从您的文字来看,它看起来像

      mysql_query("SELECT COUNT(*) FROM offer offer WHERE offer.is_solved = 0  ORDER BY offer.creation_time  DESC LIMIT".$interval_begin.",".$interval_end);
      

      足够了。

      “我们需要知道的是每个“报价”的确切解决方案数量,而不仅仅是是否有任何解决方案。” - 在这种情况下,您的初始 SQL 是错误的,它只是计算订单。你需要类似的东西

      mysql_query("SELECT offer.oid, COUNT(solution.oid) FROM offer offer LEFT JOIN ON offer.oid = solution.oid WHERE offer.is_solved = 0 GROUP BY offer.oid ORDER BY offer.creation_time  DESC LIMIT".$interval_begin.",".$interval_end);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-24
        • 2012-02-26
        • 1970-01-01
        • 2013-09-15
        • 1970-01-01
        • 2015-01-11
        • 1970-01-01
        相关资源
        最近更新 更多