【问题标题】:MySQL - SELECT ... (Subquery) AS fieldnameMySQL - SELECT ...(子查询)作为字段名
【发布时间】:2014-02-07 20:54:33
【问题描述】:

我目前有一个用于论坛的 MySQL 帖子表。这包括父帖子和子帖子。如果它是一个父帖子,它有一个topic。如果是子帖子,则包含parent_id

例如:

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”字段吗?

谢谢!

【问题讨论】:

  • 你可以用例,CASE WHEN parent_id IS NULL THEN 'self' ELSE parent_id END
  • 我的问题在于从父帖子返回“主题”字段:)

标签: mysql sql select subquery


【解决方案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;

【讨论】:

  • 谢谢!不得不费力地让它适合我的模型(应该逐字使用我的模型),但这成功了!您指出应避免使用子查询的任何具体原因?
  • 出于性能原因,应尽可能避免子查询(有关该主题的一些讨论,请参阅stackoverflow.com/questions/2577174/join-vs-sub-query)。
【解决方案2】:

试试这个查询,如果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

【讨论】:

  • 此处不需要子查询,因此应避免使用。
猜你喜欢
  • 1970-01-01
  • 2014-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多