我是php-mysql的初学者,我正试图解决这个问题。
我有两个表,如图所示:主题表和会话表。
我试图将表合并到:
1)显示属于特定类别的标题(例如,如果category = color,则显示标题:'橙色的颜色'以及'香蕉的颜色'。)
2)显示与每个标题相关联的最后评论的日期(例如,'橙色的最新日期'是
3)按最新日期排序标题 - 降序
我可以管理第一部分,但我在第2部分和第3部分时遗失了。感谢任何帮助。
答案 0 :(得分:0)
如果有人有兴趣,这段代码似乎对我有用。
SELECT title, dateM FROM topic JOIN
(SELECT topic_id, MAX(date) as dateM FROM conversation GROUP BY topic_id
) AS c
ON c.topic_id=topic.id
WHERE category=color ORDER by dateM DESC
答案 1 :(得分:-1)
您只需要一个加入:
SELECT `topic`.`title`, `conversation`.`year`
FROM `conversation`
INNER JOIN `topic` on `topic`.`ID` = `conversation`.`topic_id`
答案 2 :(得分:-1)
您将使用SELECT CASE,JOIN和子查询来实现这一目标。
让我们从开始开始吧。由于我不知道你的桌子的名字,我会写一些假名。你说你有两个表:一个用于主题,另一个用于回复。你还提到了一些类别,但你没有说明它是如何工作的,所以我将它写成一个主题表的列。
Table T = Topic's table
+ Table R = Reply's table
还要考虑registry_date
TIMESTAMP列,我们会保存行的注册日期。
要通过上次更改来实现订单,您需要获得以下信息:
您可以通过搜索上一个回复来回答这两个问题。
SELECT R.topicID, R.registry_date FROM R GROUP BY R.topicID ORDER BY R.registry_date DESC
那将是你的子查询。但是,当您在ORDER BY查询中需要它时,您应该将该结果与主题表一起加入。
SELECT T.title, T.category FROM T LEFT JOIN {subquery} AS Rs ON T.ID=Rs.topicID GROUP BY T.ID
尚未订购。请注意,我将子查询结果称为“Rs”。 现在我们将使用我们的CASE。与我之前写的不同,不是做SELECt CASE,而是尝试ORDER BY CASE,好吗?这很简单。
首先让我们安装CASE查询。
CASE
WHEN Rs.registry_date IS NULL THEN T.registry_date
ELSE Rs.registry_date
END
我们的第一个条件检查是否有任何答案。如果它是空的,我们将使用主题的注册日期。如果已填充,我们将使用回复的注册日期。现在我们在ORDER BY上应用CASE查询,如下所示:
ORDER BY {CASE} DESC
由于您可能需要最后一次更改日期信息,我们需要在SELECT上获取它。您也可以在此处使用CASE查询。
SELECT T.title, T.category, {CASE} AS `last_change` (...)
然后我们的查询最终结果如下:
SELECT
T.title,
T.category,
CASE
WHEN Rs.registry_date IS NULL THEN T.registry_date
ELSE Rs.registry_date
END AS `last_change`
FROM T
LEFT JOIN (
SELECT
R.topicID,
R.registry_date
FROM R
GROUP BY R.topicID
ORDER BY R.registry_date DESC
) AS Rs ON Rs.topicID=T.ID
GROUP BY T.ID
ORDER BY
CASE
WHEN Rs.registry_date IS NULL THEN T.registry_date
ELSE Rs.registry_date
END DESC
就像你问的那样,WHERE T.category='color'
SELECT
T.title,
T.category,
CASE
WHEN Rs.registry_date IS NULL THEN T.registry_date
ELSE Rs.registry_date
END AS `last_change`
FROM T
LEFT JOIN (
SELECT
R.topicID,
R.registry_date
FROM R
GROUP BY R.topicID
ORDER BY R.registry_date DESC
) AS Rs ON Rs.topicID=T.ID
WHERE T.category='color'
GROUP BY T.ID
ORDER BY
CASE
WHEN Rs.registry_date IS NULL THEN T.registry_date
ELSE Rs.registry_date
END DESC
如果遗漏了某些东西,请告诉我。