【问题标题】:When joining the same table, how to put the joined data in separate rows rather than separate columns?连接同一张表时,如何将连接后的数据放在单独的行而不是单独的列中?
【发布时间】:2021-11-23 16:03:42
【问题描述】:

假设,我有如下查询。

select * from `Students` s1
join `Students` s2
on s2.id = s1.id + 1 and s2.marks >= 80 and s1.marks >= 80

在这种情况下,s1s2 的数据将被放入两个单独的列中,但我怎样才能将它们放入单独的行中呢?

这是一个示例数据:

+---+------+
| id| marks| 
+---+------|
| 1 | 88   |
| 2 | 77   |
| 3 | 81   |
| 4 | 82   |
| 5 | 75   |
| 6 | 80   |
| 7 | 90   |
| 8 | 93   |
+---+------+

我想要的是显示两个连续 80+ 标记的行(按id 排序)。例如,在这种情况下,将显示 id 为 3、4、6、7 和 8 的行。

【问题讨论】:

  • 请提供少量具有表结构和预期输出的示例数据。
  • 您已经成为 SO 用户 10 年了,您一定知道您需要为 SQL 问题提供示例数据和预期结果。
  • @Stu 刚刚添加了示例数据和预期输出。

标签: mysql sql join window-functions exists


【解决方案1】:

如果您的 MySql 版本是 8.0+,您可以使用 LAG()LEAD() 窗口函数来检查每行的 marks 的上一个和下一个值:

SELECT id, marks
FROM (
  SELECT *,
         LAG(marks) OVER (ORDER BY id) prev_marks,
         LEAD(marks) OVER (ORDER BY id) next_marks
  FROM students       
) t
WHERE marks >= 80 AND (prev_marks >= 80 OR next_marks >= 80)
ORDER BY id;

对于以前的版本,请使用EXISTS:

SELECT s1.*
FROM students s1
WHERE s1.marks >= 80
AND EXISTS (
  SELECT 1 
  FROM students s2
  WHERE s2.id IN (s1.id - 1, s1.id + 1) AND s2.marks >= 80
)
ORDER BY s1.id;

或者,使用自联接:

SELECT DISTINCT s1.*
FROM students s1 INNER JOIN students s2
ON s2.id IN (s1.id - 1, s1.id + 1)
WHERE s1.marks >= 80 AND s2.marks >= 80
ORDER BY s1.id;

请参阅demo

【讨论】:

    【解决方案2】:

    如前所述,没有看到您的数据,我猜您可以在查询中使用联合

    SELECT
      s1.*
    FROM
      `students` s1
      JOIN students s2
        ON s2.id = s1.id + 1
        AND s2.marks >= 80
        AND s1.marks >= 80
    UNION
    SELECT
      s2.*
    FROM
      `students` s1
      JOIN students s2
        ON s2.id = s1.id + 1
        AND s2.marks >= 80
        AND s1.marks >= 80
    ORDER BY id;
    

    【讨论】:

    • 当然可以,但是没有更优雅的解决方案吗?
    • 另一个解决方案是由一位资深成员以不同的方法发布的,绝对可以帮助您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2016-02-03
    • 2016-05-08
    • 2012-08-22
    相关资源
    最近更新 更多