mysql - UNION 和子查询 (MySQL)

标签 mysql sql

我什至不确定标题是否正确,但这就是情况,经过简化。

我有一张表,其中包含邻接列表:

comments
- id (int)
- parent_id (int)
- depth_level (int)
- ...

我想要做的是使用 order by 和 limit 来查询深度级别 0,并且对于返回的每一行,我想要一个带有查询的联合,该查询返回相同的表以及 order by 和 limit 但不同的深度级别,并且我希望该子查询仅返回与父深度级别相关的行...等等。如果有帮助的话,我可以限制深度水平。 我有点没有引用资料,就像这样:

select * from ( select * from comments where depth = 0 order by id asc LIMIT 10 ) D0
union all 
select * from ( select * from comments where depth = 1 order by id asc LIMIT 10 ) D1

我得到联合行,但正如您所看到的,我希望 D1 仅包含具有带有 D0 id 的parent_id 的行...并且我希望针对多个级别。也许这是错误的做法。我知道这是一厢情愿的想法,但如果行数超过提供的限制,我能以某种方式获取每一行,那就太好了。

一个例子:

id  parent_id   depth   title
1   0           0       Title 1
2   0           0       Title 2
3   1           1       Title 3
4   1           1       Title 4
5   1           1       Title 5
6   1           1       Title 6
7   1           1       Title 7
8   4           2       Title 8
9   4           2       Title 9
10  4           2       Title 10
11  4           2       Title 11

pseudo:
select * from table where depth = 0 order by id asc limit 1
union 
select * from table where depth = 1 and parent_id from firstQuery.id order by id asc limit 2
union
select * from table where depth = 2 and parent_id from secondQuery.id order by id asc limit 3

result:

id  parent_id   depth   title
1   0           0       Title 1
3   1           1       Title 3
4   1           1       Title 4
8   4           2       Title 8
9   4           2       Title 9
10  4           2       Title 10

编辑2:

扩展彼得姆的答案。

(
SELECT *
FROM comments
WHERE depth = 0
ORDER BY id DESC
LIMIT 2
)
UNION ALL
(
  SELECT c.*
    FROM comments c JOIN 
    (
      SELECT id
      FROM comments
      WHERE depth = 0
      ORDER BY id DESC
      LIMIT 2
    ) p ON c.parent_id = p.id
    LIMIT 5
)


id  parent_id   depth   title
1   0           0       Title 1
2   0           0       Title 2
3   1           1       Title 3
4   1           1       Title 4
5   1           1       Title 5
6   1           1       Title 6
7   1           1       Title 7

但我想要的是限制每个父深度级别,而不是限制总深度级别。像这样(在本例中每个深度 1 5 个):

id  parent_id   depth   title
1   0           0       Title 1
2   0           0       Title 2
3   1           1       Title 3
4   1           1       Title 4
5   1           1       Title 5
6   1           1       Title 6
7   1           1       Title 7
8   2           1       Title 8
9   2           1       Title 9
10  2           1       Title 10
11  2           1       Title 11
12  2           1       Title 12

最佳答案

虽然很丑,但你可以做到

(
  SELECT *
   FROM comments
  WHERE depth = 0
  ORDER BY id
  LIMIT 1
)
UNION ALL
(
  SELECT c.*
   FROM comments c JOIN 
  (
    SELECT id
     FROM comments
    WHERE depth = 0
    ORDER BY id
    LIMIT 1
  ) p ON c.parent_id = p.id
   LIMIT 2
)
UNION ALL
(
  SELECT c.*
   FROM comments c JOIN 
  (
    SELECT c.*
     FROM comments c JOIN 
    (
      SELECT id
       FROM comments
      WHERE depth = 0
      ORDER BY id
      LIMIT 1
    ) q ON c.parent_id = q.id
     LIMIT 2
  ) p ON c.parent_id = p.id
   LIMIT 3
)
-- ORDER BY id

输出:

| ID | PARENT_ID | DEPTH |    TITLE |
|----|-----------|-------|----------|
|  1 |         0 |     0 |  Title 1 |
|  3 |         1 |     1 |  Title 3 |
|  4 |         1 |     1 |  Title 4 |
|  8 |         4 |     2 |  Title 8 |
|  9 |         4 |     2 |  Title 9 |
| 10 |         4 |     2 | Title 10 |

这里是SQLFiddle 演示

关于mysql - UNION 和子查询 (MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19105871/

相关文章:

mysql - INSERT INTO SELECT WHERE,检查重复条目

mysql - CROSS JOIN 什么时候有用?

java - 为什么这种排序在 Solr 中不起作用?

Mysql 在非常大的表上计算性能

mysql - 如何获取表中具有多个匹配行值的行数?

java - MyBatis 参数索引超出范围

mysql - 获取随机记录

mysql - SQL 挑战 - 显示具有特定列值的 N(1、X 或全部)行

java - createNativeQuery 映射到 POJO(非实体)

mysql - 在 mysql 中对左连接使用限制