2014-02-07 162 views
0

我目前有一個MySQL論壇表的帖子。這包括家長帖子和子帖子。如果它是一個父職位,它有一個topic。如果是兒童帖子,則包含parent_idMySQL - SELECT ...(子查詢)AS字段名稱

如:

TABLE posts 

+----+-----------+---------+--------+------+ 
| id | parent_id | topic | author | body | 
+----+-----------+---------+--------+------+ 
| 1 |  NULL | "Hello" | "Me" | ... | 
| 2 |   1 | NULL | "Me" | ... | 
+----+-----------+---------+--------+------+ 

我想運行一個SQL查詢,類似於以下內容:

SELECT id, 'self' AS parent_id, topic, author, body FROM posts WHERE parent_id IS NULL, 
UNION 
SELECT id, parent_id, (SELECT topic WHERE id=parent_id) as topic FROM posts WHERE topic IS NULL 

所需的輸出:

+----+-----------+---------+--------+------+ 
| id | parent_id | topic | author | body | 
+----+-----------+---------+--------+------+ 
| 1 | "self" | "Hello" | "Me" | ... | 
| 2 |   1 | "Hello" | "Me" | ... | 
+----+-----------+---------+--------+------+ 

基本上,我想返回父主題而不必運行多個查詢。有沒有辦法做到這一點?我應該只添加一個「parent_topic」字段嗎?

謝謝!

+0

WHEN PARENT_ID爲null,則 '自我' ELSE PARENT_ID END'可以使用的情況下,'CASE。 – user2989408

+0

我的問題在於從父帖子返回「主題」字段:) – Trey

回答

1

下面的SQL會做你要找的內容:

select p_child.id, if(p_child.parent_id is null, 'self', p_child.parent_id) as parent_id, if(p_parent.id is null, p_child.topic, p_parent.topic) as topic, p_child.author, p_child.body 
from posts p_child 
    left join posts p_parent on p_child.parent_id = p_parent.id; 
+0

謝謝!爲了讓它適合我的模型(我應該剛剛使用我的模型逐字),不得不花費一點時間,但是這樣做的確有用!你爲什麼注意到應該避免子查詢的具體原因? – Trey

+1

出於性能原因,應儘可能避免子查詢(有關該主題的某些討論,請參閱http://stackoverflow.com/questions/2577174/join-vs-sub-query)。 –

0

試試這個查詢,如果parent_id is not null,我在子查詢中選擇父母'topic。我正在使用case來做到這一點。

SELECT id, 
    CASE WHEN parent_id IS NULL THEN 'SELF' 
     ELSE parent_id 
    END as parent_id 
    CASE WHEN parent_id IS NOT NULL THEN (SELECT t.topic FROM posts as t WHERE t.id = m.parenyt_id) 
     ELSE topic 
    END as Topic, 
    author, 
    body 
FROM posts as m 
+0

此處不需要子查詢,因此應該避免。 –