在WHERE AND之间的SQL中的IF ELSE语句

时间:2014-01-14 12:42:20

标签: php mysql sql

我已经搜索了几个小时,但到目前为止似乎没有任何工作。

我正在尝试按最后一项活动订购论坛主题。所以我正在搜索上一个活动的主题和反应。一切似乎都在起作用,直到新主题被添加。

这是我目前的代码,是的,我明白为什么它不起作用,但我似乎无法解决它。

SELECT a.forum_topic_id, a.title, a.sticky, a.date_changed, b.date_changed 
FROM forum_topics AS a, forum_reactions AS b 
WHERE a.forum_subcat_id = ".$fsubcatid." 
AND (a.forum_subcat_id = ".$fsubcatid." AND a.forum_topic_id = b.forum_topic_id) 
OR (a.forum_subcat_id = ".$fsubcatid.")
ORDER BY 
CASE WHEN a.date_changed < b.date_changed THEN b.date_changed WHEN a.date_changed > b.date_changed THEN a.date_changed END
DESC;");

所以你可以看到。在制作新主题时,a.forum_subcat_id不能是b.forum_topic_id,因为还没有任何反应。这就是它出错的地方。 对于所有有反应的主题,他必须看看:

WHERE a.forum_subcat_id = ".$fsubcatid." AND a.forum_topic_id = b.forum_topic_id ORDER BY ...

对于所有新主题,他只需要看一下:

WHERE a.forum_subcat_id = ".$fsubcatid." ORDER BY...

在前端部分,我用一个foreach循环PHP来获取它。 因此,对于每个主题,他都必须搜索这些内容。

到目前为止,我已经完成了这些链接:

2 个答案:

答案 0 :(得分:2)

我想你想要left outer join。通常,最好使用显式join语法:

SELECT a.forum_topic_id, a.title, a.sticky, a.date_changed, b.date_changed 
FROM forum_topics AS a left outer join
     forum_reactions AS b 
     on a.forum_topic_id = b.forum_topic_id
WHERE a.forum_subcat_id = '".$fsubcatid."'
ORDER BY CASE WHEN a.datum_gewijzigd < b.datum_gewijzigd THEN b.datum_gewijzigd
              WHEN a.datum_gewijzigd > b.datum_gewijzigd THEN a.datum_gewijzigd
         END DESC;

请注意,order by不会考虑不匹配。对于这种情况,您可能需要条件where b.datum_gewijzigd is null

编辑:

正如我在说明中所提到的,您需要先修改order by以获得no个反应。我想这可能是你想要的:

ORDER BY CASE WHEN a.datum_gewijzigd < b.datum_gewijzigd THEN b.datum_gewijzigd
              WHEN a.datum_gewijzigd > b.datum_gewijzigd THEN a.datum_gewijzigd
              ELSE a.datum_gewijzigd
         END DESC;

答案 1 :(得分:0)

如果我正确理解了这个问题,你想选择MAX(a.date_changed,b.date_changed)以通过LEFT加入获得最新的更改:

FROM forum_topics AS a 
LEFT JOIN forum_reactions AS b ON a.forum_topic_id = b.forum_topic_id

所以这个:

WHERE a.forum_subcat_id = '".$fsubcatid."' ORDER BY...

将获取所有新主题,以及B中的任何反应,如果有的话。