我想写一个sql语句,其中列出了一系列产品,这些产品都属于每套订购一套的产品,并列出所有产品。
我的产品是这样组织的。
设置01
产品01
产品02
产品03
设置02
产品06
产品07
产品08
产品09
设置03
产品11
产品12
产品13
产品14
产品15
我想创建一个像这样组织它们的SQL查询
设置01 - 产品01
设置02 - 产品06
设置03 - 产品11
设置01 - 产品02
设置02 - 产品07
设置03 - 产品12
设置01 - 产品03
设置02 - 产品08
设置03 - 产品13
设置02 - 产品09
设置03 - 产品14
设置03 - 产品15
我可以查询按集合分组的产品,但无法获得每套产品。
select
`product_set`.`product_id`,
`product_set`.`set_id`,
`product_set`.`order`
from
`product_set`
inner join
`sets`
on
`product_set`.`set_id` = `sets`.`id`
where
`condition` = true
答案 0 :(得分:2)
看看这个答案: https://stackoverflow.com/a/532941/4770578
您需要执行以下操作:
SELECT * FROM (
SELECT product_id, set_id,
@product:=CASE WHEN @set <> set_id THEN 0 ELSE @product+1 END AS rn,
@set:=set_id AS r_set
FROM
(SELECT @product:= -1) s,
(SELECT @set:= -1) c,
(SELECT *
FROM product_sets
ORDER BY set_id, product_id
) t
) t1
ORDER BY rn, set_id, product_id;
为每个行创建行号,然后按行号进行排序。
答案 1 :(得分:2)
基本上,您可以按以下方式枚举值:
select ps.*
from (select ps.*,
(@rn := if(@s = set_id, @rn + 1,
if(@s := set_id, 1, 1)
)
) as rn
from (select ps.product_id, ps.set_id, ps.order
from product_set ps join
sets s
on ps.set_id = s.id
where s.conditionk = true
order by ps.set_id, ps.order
) ps cross join
(select @s := -1, @rn := 0) params
) ps
order by rn, set_id;