2017-03-31 22 views
-1

私はphp-mysqlの初心者です。これを理解しようとしています。テーブルへの結合と最新の日付によるソート

トピックテーブルと会話テーブルの2つのテーブルがあります。

私はテーブルをマージしようとしている

:「オレンジの色」と「カラー:特定のカテゴリ(例えば、もしカテゴリ=色、タイトルを表示に属しているタイトルを表示)

1バナナのオレンジ色の色 『2009

3である)でタイトルを並べ替え」

2))。最後のコメントの日付を表示する(たとえば、のために、最新の日付は各タイトルに関連付けられて作られました』最新の日付 - 降順

できます私はパート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とサブクエリを使用します。

EDIT

始めから始まります。私はあなたのテーブルの名前を知らないので、私はいくつかの偽の名前を書くでしょう。あなたは2つのテーブルを持っていると言っています.1つはトピック用、もう1つは応答用です。また、いくつかのカテゴリについて述べましたが、どのように動作するかは指定されていないため、トピックの表の列として記述します。

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 

私たちの最初の条件付きチェックは何か答えがあるかどうかをチェックします。空欄の場合は、トピックの登録日を使用します。入力された場合は、返信の登録日を使用します。今、私たちはこのような、当社のORDER上のCASEクエリを適用します。

ORDER BY {CASE} DESC 

あなたはおそらく我々がSELECTでそれを取得する必要があります最終変更日の情報が欲しいと。ここでもCASEクエリを使用できます。

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" 文を向上させることができます

SELECT T.title, T.category, {CASE} AS `last_change` (...) 

その後、私たちのクエリは次のように終わります。あなたが尋ねたのと同じように

、例えば、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

私は遅いですが、私は今ここにいます。1分待ってください。Sharon99 –

+0

あなたは質問にも答えません。それを読んでもらえましたか? – 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 
関連する問題