选择不在选定字段中的字段 - MySQL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选择不在选定字段中的字段 - MySQL相关的知识,希望对你有一定的参考价值。

我有一张包含歌曲的表格。我想在一个查询中选择前3首最喜欢的歌曲和3首随机歌曲,这些歌曲不在第一首歌曲中。

例如:table of songs和预期产量:

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 访问全局视图表

推动不在 MySql 查询中的字段名称中添加单引号

使用angular js根据下拉列表中的选定输入隐藏表单中的字段

根据下拉列表中的选定值显示表单字段Angular TypeScript