mysql类别中的第一个自由位置id

ttygqcqt  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(352)

我一直在搜索一个查询,以获取某个类别id中的第一个空闲位置id。到目前为止,我已经看到了带有左连接之类的查询,但是找不到where子句。所以,我的问题是在添加产品的类别中找到第一个自由位置。
例子:

id_category id_product position
100 10 0
100 11 1
100 12 3
100 13 4
100 14 5
100 15 7
100 16 8
100 17 9

所以我在找幸运数字2,其中id\u category=100。
就我所知。。

SELECT MIN(cp.id_category + 1) AS position FROM ps_category_product cp

LEFT JOIN ps_category_product cp1 ON cp.id_category = cp1.id_category

WHERE cp1.position IS NULL
yduiuuwa

yduiuuwa1#

你能做到的

SELECT MIN(position), id_category
FROM ps_category_product o
WHERE NOT EXISTS (
    SELECT 1
    FROM ps_category_product i 
    WHERE i.position    = o.position + 1
      AND i.id_category = o.id_category
)
GROUP BY id_category;
4c8rllxm

4c8rllxm2#

假设一个可能的位置可以是表中最小位置和最大位置之间的任何位置,并且数据库中的某个位置有一个具有顺序id号的表(在下面的示例中,我有日期),那么您可以创建一个类别可以拥有的所有位置的列表,然后排除它们确实拥有的位置。例如

drop table if exists o;
create table o
(id_category int, id_product int, position int);
insert into o values
(100 ,10 ,0),
(100 ,11 ,1),
(100 ,12 ,2),
(100 ,12 ,3),
(100 ,13 ,4),
(100 ,14 ,5),
(100 ,14 ,6),
(100 ,15 ,7),
(100 ,16 ,8),
(102 ,16 ,8),
(102 ,17 ,9);

select a.id_category, min(possible)
from
(
select o.*,p.possible
from
(
select 0 as possible
union
select id from dates d
where d.id <= (select max(position) from o) + 1
) p
cross join (select distinct id_category from o) o
) a
left join
(select * from o) b on b.id_category = a.id_category and b.position = a.possible
where b.position is null
group by a.id_category;

结果

+-------------+---------------+
| id_category | min(possible) |
+-------------+---------------+
|         100 |             9 |
|         102 |             0 |
+-------------+---------------+
2 rows in set (0.01 sec)

相关问题