- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 3 个表:video、video_category 和 video_category_join。
一个视频可以有多个 video_category
,并且一个 video_category
可以在多个视频中关联:因此 video_category_join
表
表格:视频
| video_id | title | duration |
|-------------------------------|
| 12 | title12 | 190 |
| 24 | title24 | 190 |
| 78 | title78 | 190 |
| 34 | title34 | 190 |
| 91 | title91 | 190 |
| 88 | title88 | 190 |
表格:video_category
| video_category_id | name |
|-----------------------------|
| 4 | music |
| 8 | tv |
| 5 | black |
| 2 | politic |
| 1 | movie |
| 6 | other |
表格:video_category_join
| video_id | video_category_id |
|------------------------------|
| 24 | 4 |
| 24 | 5 |
| 78 | 4 |
| 78 | 5 |
| 88 | 1 |
| 91 | 4 |
| 91 | 1 |
给定一个 video_id
,我想返回 20 个与 video_id
具有相同类别的视频。
如果结果集返回的视频少于 20 个,我希望能够通过选择随机视频进行补偿,直到达到 20 个视频(优先级始终是选择具有相同类别的视频,如有必要,随机视频,直到我最多 20 个视频)。
因此,如果video_id
= 24,则结果集将返回
| video_id |
|----------|
| 78 |
| 91 |
| 12 |
| 88 |
| 34 |
video_id
74 和 91 与 video_id
24 具有相同的类别,因此始终位于顶部。然后,要获取最多 20 个视频,结果集将返回随机 video_id
12、34 和 91。
我问了很多问题,发现我需要 UNION 类型的查询。这是我根据我在这里提出的问题构建的内容...我快到了,我只需要完成最后一个查询即可获取 video_id
12、88 和 34
SELECT video_id, title, duration
FROM (
(
SELECT v.video_id, v.title, v.duration, 1 AS preferred
FROM video_category_join vc
JOIN video_category_join vc2 ON vc2.video_category_id = vc.video_category_id AND vc2.video_id <> vc.video_id
JOIN video v ON v.video_id = vc2.video_id
WHERE vc.video_id = 24
GROUP BY vc2.video_id
ORDER BY RAND()
LIMIT 20
)
UNION
(
...
)
) AS t1
ORDER BY preferred
LIMIT 20
最佳答案
您需要在与您搜索的视频具有相同类别的所有视频与表格的所有行之间使用 UNION ALL
。
联合结果集的行将因 preferred
列的值而有所不同。
然后进行分组,仅保留常见视频的最小 preferred
,最后按 preferred
和 rand()
排序:
select t.video_id, t.title, t.duration
from (
select
t.video_id, t.title, t.duration, min(t.preferred) preferred
from (
select distinct v.*, 1 preferred
from video v inner join video_category_join j
on j.video_id = v.video_id
where v.video_id <> 24
and j.video_category_id in (
select video_category_id
from video_category_join
where video_id = 24
)
union all
select video_id, title, duration, 2 preferred
from video
where video_id <> 24
) t
group by t.video_id, t.title, t.duration
) t
order by preferred, rand()
limit 20
请参阅demo (对于限制 4)。
结果:
| video_id | title | duration |
| -------- | ------- | -------- |
| 91 | title91 | 190 |
| 78 | title78 | 190 |
| 34 | title34 | 190 |
| 12 | title12 | 190 |
关于mysql - 如何从 UNION 查询返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57562965/
自从我的问题here无法自信地回答,我在这里再次询问,希望有人确切知道: 指向 union 的指针和包含指向其元素的指针的 union 之间有什么区别(除了语法之外)吗? this中生成的程序集示例是
在 C 语言中,是否可以在另一个 union 体中定义一个 union 体?如果不是,为什么不可能?或者如果可以,可以在哪里使用? 最佳答案 假设您要定义: union myun { int x;
在 C 中,是否可以在另一个 union 中定义一个 union ?如果不是,为什么不可能?或者如果是,它可以在哪里使用? 最佳答案 假设你想定义: union myun { int x; s
我正在阅读一些代码并发现如下内容: typedef union { int int32; int boolean; time_t date; char *string;
我正在学习Lua,我更愿意使用冒号(:)作为方法。不幸的是,它并非在所有地方都有效。看我的代码: 设置= {} 本地mt = {} 函数Set:new(m) 本地集= {} setmetatable(
我遇到了一些性能问题,我有如下查询: SELECT * FROM Foo UNION SELECT * FROM Boo UNION SELECT * FROM Koo 我确信 Koo 不会返回任何重
This question already has answers here: C++ Structure Initialization (16个答案) 上个月关闭。 我正在尝试将一些用于嵌入式目标的
UNION 和 UNION ALL 有什么区别? 最佳答案 UNION 删除重复记录(结果中的所有列都相同),UNION ALL 则不会。 使用 UNION 而不是 UNION ALL 时会影响性能,
我想在两个表上使用联合运算符。我希望结果集消除由联合创建的重复值,但不消除表中预先存在的重复值。考虑这段代码... select b from (values (1), (2), (2
我知道 UNION 会删除重复项,但即使没有重复项也会更改结果顺序。 我有两个 select 语句,任何地方都没有 order by 语句 我想将它们合并或不合并(全部) 即 SELECT A UNI
基本上,我有一个 struct foo { /* variable denoting active member of union */ enum whichmembe
我有一个大规模查询,用于对许多表(每个表有数千行)执行 UNION ALL,然后在返回之前输出到临时表。 旧形式: SELECT * FROM (SELECT `a` AS `Human rea
UNION 和 UNION ALL 有什么区别? 最佳答案 UNION 删除重复记录(结果中的所有列都相同),UNION ALL 则不会。 使用 UNION 而不是 UNION ALL 时会影响性能,
如果我有两个 union 行结构: struct A { A() {} ~A() {} union { vector vi; vector db
考虑下面的代码,我已经写了: #include #include union myAccess { uint16_t access16; struct { uint
我想弄清楚你从 C99 中对齐变量的地役权中得到了什么: Exception to strict aliasing rule in C from 6.5.2.3 Structure and union
我正在通过 UNION 或 UNION ALL 从多个表中选择一列外键。 当重复无关紧要时,通常建议使用 UNION ALL 而不是 UNION 来解决性能问题。但是,在我的调用 PHP 脚本中,循环
在 C++ 中,union 可以包含静态成员,在类的情况下,这些成员属于一个类,因此对所有对象都是通用的。 union U { long l; int i; static long
任何人都可以提及普通和匿名 union (或结构)之间的区别吗?我刚找到一个: 不能在匿名 union 中定义函数。 最佳答案 您不需要点运算符“.”访问匿名 union 元素。 #include
我可能把这个复杂化了.. 我正在尝试在 Arduino 上用 C 语言为嵌入式应用程序制作一个相当可重用的分层菜单系统。我有结构来表示不同类型的菜单项,包括那些子菜单,以及这些菜单项的 union 是
我是一名优秀的程序员,十分优秀!