let data = await Category.findAll({
where: { list_category_id: body.category_id },
attributes: {
include: [
[
sequelize.literal(`COALESCE (
CASE WHEN youtube_id_id IS NOT NULL THEN ROW_NUMBER() OVER (ORDER BY random(), youtube_id_id) END,
CASE WHEN instagram_id_id IS NOT NULL THEN ROW_NUMBER() OVER (ORDER BY random(), instagram_id_id) END )`),
"row_num",
],
],
},
order: [sequelize.literal("row_num")],
});
字符串
在一行中,只有一个会有一个值youtube_id_id或Instagram_id_id,我想出了这个,这样我就可以得到的行与值都为youtube_id_id和Instagram_id_id列每一次,但这只工作没有随机()在ORDER BY。我想得到随机结果,每次我运行这个,并在同一时间确保行与两个值都存在。我如何才能使这工作?
编辑:
类别表:
export const Category = sequelize.define(
"category",
{
id: {
type: DataTypes.UUID,
defaultValue: sequelize.literal("gen_random_uuid()"),
primaryKey: true,
},
score: {
type: DataTypes.FLOAT,
allowNull: false,
},
createdAt: {
type: DataTypes.DATE,
defaultValue: sequelize.literal("NOW()"),
},
updatedAt: {
type: DataTypes.DATE,
defaultValue: sequelize.literal("NOW()"),
},
},
{
underscored: true,
tableName: "Category",
}
);
型youtube_id_id
和instagram_id_id
是外键。
样本数据:
| ID| youtube_id_id| Instagram_id_id|
| --|--|--|
| UUID||UUID|
| UUID| UUID||
| UUID| UUID||
| UUID||UUID|
Expected Output有点难以描述,我需要每个外键的数据,比如我将数据限制为2,所以我应该总是得到两个键都有值的行。
基本上我认为我想要的是,当ROW_NUMBER()编号从1开始而不是从第一行开始时,它会给它分配一个随机行并继续下去。这应该会随机得到我的结果,有没有办法实现这一点?
2条答案
按热度按时间7cjasjjr1#
我修复了它,只是不得不按列分区和随机分组。
字符串
mzaanser2#
我想在每次运行时都得到随机结果,同时确保具有这两个值的行都存在。
您可以进行两个查询,然后对它们进行
union
。字符串
Demonstration的一个。
Sequelize并不直接支持
union
,但您可以通过combining two queries with aPromise.all
来模拟它。