选择不在选定字段中的字段 - MySQL
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选择不在选定字段中的字段 - MySQL相关的知识,希望对你有一定的参考价值。
我有一张包含歌曲的表格。我想在一个查询中选择前3首最喜欢的歌曲和3首随机歌曲,这些歌曲不在第一首歌曲中。
song 6, song 8, song 5 then *whatever song*,*whatever song*,*whatever song*
这是我尝试但不工作的:
SELECT a.`song_id`, a.`name`, a.liked, b.song_id
FROM `song` AS a,
(SELECT song_id FROM song ORDER BY liked DESC LIMIT 3) as b
WHERE a.song_id <> b.song_id LIMIT 3
SELECT
a.`song_id`, a.`name`, a.liked, b.ids
FROM
`song` AS a,
(SELECT substring_index(GROUP_CONCAT(DISTINCT song_id ORDER BY liked DESC SEPARATOR ','), ',', 3) as ids FROM song) as b
WHERE
a.song_id not in(b.ids)
我正在使用MariaDB 10.1.29,它与子查询或LIMIT
子句中的WITH
不兼容。
答案
我目前只安装了MariaDB 10.3,但我在较旧的mysql 4.1上尝试了下面的语法,两者都返回相同的结果。
SELECT * FROM (
(SELECT * FROM song ORDER BY liked DESC LIMIT 3) UNION
(SELECT A.* FROM song A LEFT JOIN (SELECT * FROM song ORDER BY liked DESC LIMIT 3) B ON A.song_id=B.song_id
WHERE B.song_id IS NULL ORDER BY RAND() LIMIT 3)) S ORDER BY liked DESC;
另一答案
使用带有LIMIT的2个CTE可在MariaDb 10.2和MySql 8.0中使用
第二个CTE是随机的,而不选择第一个CTE
WITH TOP3SONGS AS
(
SELECT *
FROM song
ORDER BY liked DESC
LIMIT 3
),
RANDOM3SONGS AS
(
SELECT *
FROM song
WHERE song_id NOT IN (select song_id from TOP3SONGS)
ORDER BY rand()
LIMIT 3
)
SELECT *
FROM TOP3SONGS
UNION ALL
SELECT *
FROM RANDOM3SONGS;
这适用于MySql 5.6,因此很可能也在MariaDb 10.1.29中 (我无法访问10.1因此无法验证)
这次使用了top3的左连接。 并且order by将top3置于限制6之前的随机值之上。
SELECT song.*
FROM song
LEFT JOIN
( SELECT song_id, liked
FROM song
ORDER BY liked DESC
LIMIT 3
) top3songs ON top3songs.song_id = song.song_id
ORDER BY top3songs.liked DESC, RAND()
LIMIT 6;
对db <>小提琴here的测试
另一答案
您应该将其拆分为两个,并将结果联合起来:首先查询以选择前3个:
SELECT song_id FROM song ORDER BY liked DESC LIMIT 3
第二个查询选择随机三个,不包括上面选择的歌曲:
SELECT song_id FROM song WHERE song_id NOT IN (
SELECT song_id FROM song ORDER BY liked DESC LIMIT 3
) ORDER BY RAND() LIMIT 3
现在一起:
SELECT song_id FROM song ORDER BY liked DESC LIMIT 3
UNOION
SELECT song_id FROM song WHERE song_id NOT IN (
SELECT song_id FROM song ORDER BY liked DESC LIMIT 3
) ORDER BY RAND() LIMIT 3
以上是关于选择不在选定字段中的字段 - MySQL的主要内容,如果未能解决你的问题,请参考以下文章
从表中选择字段,其中 id 不在 mysql 的另一个表中 [不工作]
无法通过从下拉选择转换的选定字段代码使用 SQL 访问全局视图表