如何使用交叉连接查找行>列组合? [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]的主要内容,如果未能解决你的问题,请参考以下文章