组织一系列项目的SQL语句,每组一个

时间:2018-05-17 23:58:39

标签: mysql sql

我想写一个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

2 个答案:

答案 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;