如何使用交叉连接查找行>列组合? [SQL]

Posted

技术标签:

【中文标题】如何使用交叉连接查找行>列组合? [SQL]【英文标题】:How to find rows>columns combinations with Cross Join? [SQL] 【发布时间】:2021-02-27 06:43:20 【问题描述】:

我想创建来自不同类别 ID 的项目组合。

你能帮帮我吗?

表格

+---------+-------------+------------+
| post_id | category_id | post_title |
+---------+-------------+------------+
| 1       | 1           | Red        |
| 2       | 1           | Black      |
| 3       | 2           | Medium     |
| 4       | 3           | Male       |
| 5       | 3           | Female     |
+---------+-------------+------------+

我想要的查询结果如下:

Red-Medium-Male
Black-Medium-Male
Red-Medium-Female
Black-Medium-Female

例如,如果有属于 6 个不同类别的项目,则如下所示:

Red-Medium-Male-Other1-Other2-Other3

【问题讨论】:

【参考方案1】:

您可以使用cross join 和过滤:

select t1.post_title, t2.post_title, t3.post_title
from t t1 cross join
     t t2 cross join
     t t3
where t1.category_id = 1 and
      t2.category_id = 2 and
      t3.category_id = 3;

您可以使用递归 CTE 来概括这一点:

with recursive tt as (
      select t.*, dense_rank() over (order by category_id) as cat_seqnum
      from t
     ),
     cte as (
      select cat_seqnum, post_title
      from tt
      where cat_seqnum = 1
      union all
      select  tt.cat_seqnum, concat_ws('-', cte.post_title, tt.post_title)
      from cte join
           tt
           on tt.cat_seqnum = cte.cat_seqnum + 1
     )
select *
from cte
where cat_seqnum = (select max(cat_seqnum) from tt);

Here 是一个 dbfiddle。

【讨论】:

感谢您的回答。但类别的数量尚不清楚。查询中应该有类似循环的东西。如果你想知道我想做什么:***.com/q/64837507/6320082 @MertA。 . . .这实际上使问题变得更加有趣。 网址中的问题非常复杂。至少我创建了一个更简单的问题来创建组合。没有人回答网址中的主题。我的英语不够。 非常感谢您的回答。看起来不错。我有一个小问题:) 服务器和 MAMP 的版本都是 mysql 5.7.26。用 Mysql 5.7.26 可以做到这一点吗? @MertA 。 . .在 8.0 之前的版本中,您无法使用单个查询来执行此操作。您需要一个存储过程或其他循环机制。

以上是关于如何使用交叉连接查找行>列组合? [SQL]的主要内容,如果未能解决你的问题,请参考以下文章

左外连接和右外连接的区别

SQL - 如何查找列组合之前是不是发生过?

SQL 交叉匹配 ID 以创建新的跨平台 ID -> 如何优化

在 SQL 中查找排名最高的相交行

左连接右连接交叉连接全外连接

SQL查找以下会话 - 与交叉连接不同的逻辑