簡體   English   中英

SQL查詢合並兩個表,同時還顯示一個表中的所有記錄

[英]SQL query to combine two tables while also showing all records from one table

我正在運行以下查詢來嘗試獲取論壇中的所有類別,並發布其最新主題。 有些類別尚未發布主題,並且還希望將其返回。

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 |
+--------+---------------+------------------------+--------+

如您所見,cat_id 3尚無任何帖子,可以根據需要返回!!但是重復cat_id 1&2。

我正在嘗試刪除重復項,但不確定自己缺少什么

UNION ALL替換為UNION 后者刪除重復項。

但是,通過您的代碼,您可能正在嘗試執行LEFT OUTER JOIN ,因此您應該查看有關OUTER JOIN的一些教程。

您需要的是一個左外部連接子句,以將主題的結果與類別的結果連接起來。 這些路線的某個位置:

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;

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;

最終對我有用的是將union的結果作為派生表放入另一個select語句中,該語句按cat_id對結果進行分組,從而刪除了重復項和空值。

我還交換了UNION中的兩個select語句,因此首先執行了過濾的語句,然后是顯示所有行的語句。

感謝您的反饋!

SELECT * FROM(SELECT * FROM(SELECT cat_id,cat_name,cat_description,topic_id,topic_subject,MAX(topic_date)AS'topic_date'從類別,主題中獲得topic_cat = cat_id GROUP BY topic_Cat)一個UNION SELECT cat_id,cat_name,cat_description,NULL為topic_id,空為topic_date,空為topic_subject,來自類別)b GROUP BY cat_name;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM