从另一行中选择一个值:mysql

时间:2011-05-03 23:51:10

标签: php mysql

我有一张名为Post的表:

title (NULL), content, parent_id (NULL)

标题为空,因为我将此用于线程和回复(回复没有标题,线程没有父级)。

假设我想选择发布x的所有回复,或者n个回复:

SELECT * FROM post
WHERE title IS NULL
AND parent_id = x

,或者

SELECT * FROM post
WHERE title IS NULL
AND parent_id IS NOT NULL
LIMIT 0, 30

我如何选择回复标题?例如,如果我选择回复号码5并且它是对帖子ID#2的回复(即parent_id为2),我该如何选择号码2的标题?

我不想在mysql中使用foreach循环。

希望这是有道理的。

谢谢。

3 个答案:

答案 0 :(得分:1)

假设您的Post表结构如下:

+-----+------------+-----------------+----------+
| id  | parent_id  | title           | content  |
+-----+------------+-----------------+----------+
| 1   |  NULL      | Post #1 Title   | ...      |
+-----+------------+-----------------+----------+
| 2   |  NULL      | Post #2 Title   | ...      |
+-----+------------+-----------------+----------+
| 3   |   1        |                 | ...      |
+-----+------------+-----------------+----------+
| 4   |   2        |                 | ...      |
+-----+------------+-----------------+----------+

您需要使用联接:

SELECT
   *, parent.title AS parent_title
FROM
   post
LEFT JOIN
   post as parent ON parent.id = post.parent_id
WHERE
   post.id = 4

这会选择帖子ID = 4,并且还会为您提供存储在字段parent_title

中的帖子ID = 2的标题

答案 1 :(得分:1)

COALESCE返回非空的参数列表的第一个值。

   SELECT post.content, COALESCE(post.title, parent.title) AS title
     FROM post
LEFT JOIN post AS parent
       ON post.parent_id = parent.id
    WHERE post.parent_id = 123

答案 2 :(得分:1)

我会从你的帖子表加入你的帖子表。好有趣。 (这假设您的帖子表有一个id列,对应于parent_id)

SELECT child。*,parent.title FROM post child JOIN post parent ON(child.parent_id = parent.id)