2017-03-31 79 views
-1

我是真正的初学者到php-mysql,并试图弄清楚这一点。结合到表格和按最新的最新日期排序

我有两个表,如图所示:主题表和对话表。

我试图合并表来:

1)显示属于特定类别的标题(例如,如果category =颜色,显示的标题:“橙色的颜色”和“颜色香蕉”)。

2)显示上次评论的日期作了一个标题相关联(,例如,最新的日期‘橙色的颜色’是2009年

3)排序依据的标题最新日期 - 降序

我可以管理做第一部分,但我失去了第2和第3部分。任何帮助表示赞赏。

Image of tables and desired results

回答

-1

所有你需要的是一个连接:

SELECT `topic`.`title`, `conversation`.`year` 
FROM `conversation` 
INNER JOIN `topic` on `topic`.`ID` = `conversation`.`topic_id` 
+0

你应该考虑这个话题可能没有答复的事实。 –

-1

您将使用SELECT CASE,JOIN和子查询来实现这一目标。

编辑

让我们从begining开始。因为我不知道你的餐桌名字,我会写一些假名字。你说你有两个表格:一个表示主题,另一个表示回复。你还提到了一些类别,但你没有指定它是如何工作的,所以我会把它写成主题表格的一列。

Table T = Topic's table + Table R = Reply's table

也可以考虑registry_date TIMESTAMP列其中,我们保存行的注册日期。

要实现由过去的变化您的订单,你需要得到这样一些信息:

  1. 有答案(回复)?
  2. 如果是这样,最新的回复是 的注册日期是什么?

您可以通过搜索最后一个答复来回答这两个问题。

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 

我们的第一个条件检查是否有任何答案。如果它是空的,我们将使用该主题的注册日期。如果它已填充,我们将使用回复的注册日期。现在,我们运用我们的订单是,CASE BY查询像这样:

ORDER BY {CASE} DESC 

正如你可能想要的最后修改日期的信息,我们将需要得到它在我们的选择。你也可以在这里使用你的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 

PS:你可以在这里提高自己的 “WHERE” 语句。

就像你问,例如,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 

请让我知道如果有什么地方丢失了。

+0

我感谢您的帮助,但我不明白代码。 – Sharon99

+0

我迟到了,但我现在在这里,等一下@ Sharon99 –

+0

你甚至不回答问题smh,你甚至读过它吗 – meda

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