mySQL右外连接

时间:2011-07-30 17:23:43

标签: mysql sql join outer-join

我是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");

该查询应该是环境中的一个生活区:它需要计算所有尚未解决的要约,然后将它们列出一定的时间间隔以反映列表的某个页面。 例如,如果每个年龄有25个优惠,第2页将是26-50。

有人能说出输出为0的原因吗?所有列/表都存在,并且确实包含测试值。

3 个答案:

答案 0 :(得分: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); 

答案 1 :(得分:0)

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

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

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

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

    由于我不了解您的架构,这只是一个建议,我认为如果您有offer.is_solved列,则不需要与solution建立正确的联接。以下查询应该同样正常,不是吗?

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

    希望它有所帮助!

答案 2 :(得分:0)

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

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);