2017-03-31 110 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 
相關問題