2016-04-02 14 views
0

以下のクエリを実行して、最新のトピックが投稿されたフォーラムですべてのカテゴリを取得しようとしています。トピックがまだ投稿されていないカテゴリもありますが、それらのカテゴリも戻したいと考えています。2つのテーブルを結合して1つのテーブルのすべてのレコードを表示するSQLクエリ

SELECT cat_id,cat_name,cat_description, Null as topic_date, 
     Null as topic_subject 
FROM categories 
UNION ALL 
SELECT cat_id, cat_name, cat_description, topic_date, topic_subject 
FROM categories, topics t 
WHERE t.topic_cat=cat_id AND topic_id IN 
    (SELECT topic_id FROM 
    (SELECT topic_id FROM 
     (SELECT topic_id, topic_subject, MAX(topic_date) AS 'recent' 
     FROM topics 
     GROUP BY topic_Cat 
     ) a 
    ) b 
); 

このクエリは、次の結果を返します - あなたが見ることができるように

+--------+-----------+---------+------------+---------------+ 
| cat_id | cat_name | cat_des | topic_date | topic_subject | 
+--------+-----------+---------+------------+---------------+ 
|  1 | T20 World| Posts1 | NULL    | NULL | 
|  2 | Test  | delete1| NULL    | NULL | 
|  3 | Test 2 | txt | NULL    | NULL | 
|  1 | T20 World| Posts1 | 2016-04-01 01:54:01 | test | 
|  2 | Test  | delete1| 2016-04-01 03:05:58 | test | 
+--------+---------------+------------------------+--------+ 

、3はまだ投稿がありませんし、しかし1 & 2をCAT_ID!、必要に応じて繰り返され、返されるCAT_ID。

私は重複を削除しようとしていると私は私が

+0

私はあなたが '左の結合 'を必要としていると確信しています。しかし、サンプルデータとあなたのしていることの説明がなければ、本当の答えを策定するのは難しいです。 –

+0

私は左の結合でクエリを書き直すことができたと思います。 SQLを初めて使用する。間違いなく次回これを試してみます。ありがとうございました –

答えて

1

にいくつかのチュートリアルを確認してくださいするのものにトピックの結果を結合する左外部結合句ですカテゴリ(存在する場合のみ)どこかにこれらの線に沿って:

SELECT c.cat_id, c.cat_name, c.cat_description, 
     max(t.topic_date), t.topic_subject 
FROM categories c LEFT OUTER JOIN topics t ON t.topic_cat=c.cat_id 
GROUP BY c.cat_id, c.cat_name, c.cat_description, t.topic_subject; 
+0

フィードバックをいただきありがとうございます、これは私の質問に答えることに近いです。 NULL値を取り除きましたが、複数の投稿を持つ行は返されました。 –

+0

私はc.cat_idだけでグループ化すれば動作します! –

1

UNIONUNION ALLを交換して欠けているかわからないんだけど。後者は重複を取り除きます。

しかし、あなたのコードでは、おそらくLEFT OUTER JOINをやろうとしているので、あなたが必要なものOUTER JOIN

+1

フィードバックありがとうございます。他の結果が正確に重複していないので、組合はすべて結果を変更しなかった –

0

ビットSQLにさびが、このような何か作業をする必要があります:私は別のものに派生テーブルとして労働組合の結果を取っていたため、最終的に働いた何

SELECT 
    cat.cat_id, cat.cat_name, cat.cat_desc, topic.topic_date, topic.topic_subject 
FROM 
    categories AS cat 
LEFT OUTER JOIN (
    SELECT 
    topics.topic_date, topics.topic_subject 
    FROM 
    topics 
    ORDER BY 
    topics.topic_date DESC 
    LIMIT 
    1 
) 
    AS topic ON topic.cat_id = cat.cat_id; 
+0

フィードバックいただきありがとうございます –

0

cat_idによる結果をグループ化したselect文は、重複値とヌル値を削除しました。

また、UNION内の2つのSELECT文を入れ替えたので、フィルタ処理されたものが最初に実行され、次にすべての行が表示されたものが続きました。

フィードバックいただきありがとうございます。

SELECT *(cat_name、UNION SELECTのCAT_ID(topic_Cat BY topic_cat = CAT_IDのGROUPトピック、カテゴリから 'topic_date' としてCAT_ID、cat_name、cat_description、topic_id、topic_subject、MAX(topic_date) 選択)SELECT * FROM FROM 、cat_description、 topic_idとしてNULL、topic_dateとしてNULL、topic_subject FROMカテゴリとしてNULL)b GROUP BY cat_name;

関連する問題