结合表格并按最新的最新日期排序

时间:2017-03-31 20:30:33

标签: php mysqli

我是php-mysql的初学者,我正试图解决这个问题。

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

我试图将表合并到:

1)显示属于特定类别的标题(例如,如果category = color,则显示标题:'橙色的颜色'以及'香蕉的颜色'。)

2)显示与每个标题相关联的最后评论的日期(例如,'橙色的最新日期'是

3)按最新日期排序标题 - 降序

我可以管理第一部分,但我在第2部分和第3部分时遗失了。感谢任何帮助。

Image of tables and desired results

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列,我们会保存行的注册日期。

要通过上次更改来实现订单,您需要获得以下信息:

  1. 有答案(回复)吗?
  2. 如果是的话,注册日期是什么时候 最新回复?
  3. 您可以通过搜索上一个回复来回答这两个问题。

    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
    

    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
    

    如果遗漏了某些东西,请告诉我。