我已经搜索了几个小时,但到目前为止似乎没有任何工作。
我正在尝试按最后一项活动订购论坛主题。所以我正在搜索上一个活动的主题和反应。一切似乎都在起作用,直到新主题被添加。
这是我目前的代码,是的,我明白为什么它不起作用,但我似乎无法解决它。
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来获取它。 因此,对于每个主题,他都必须搜索这些内容。
到目前为止,我已经完成了这些链接:
答案 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中的任何反应,如果有的话。