gpt4 book ai didi

MySQL 联合错误

转载 作者:行者123 更新时间:2023-11-29 07:02:43 24 4
gpt4 key购买 nike

为什么这个查询会出现这个错误?

SELECT distinct fileID 
FROM ( SELECT fileID from file order by fileID desc limit 30) as R1
UNION (SELECT fileID from visit order by counter desc limit 30 )
WHERE status = 1 order by rand() LIMIT 10

错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE status = 1 order by rand() LIMIT 10' at line 1

我想要的是选择前 30 个查看次数最多的文件和前 30 个最近的文件,然后从中随机选择限制为 10,文件状态 = 1。

最佳答案

将最新文件和最多访问的两个查询放在子查询内的 UNION 中,然后按 RAND 对生成的派生表重新排序并将结果限制为 10。

注意:

你说你想选择最近访问过的文件..但按“计数器”排序实际上选择了访问次数最多的文件..而不是最近的文件。

SELECT DISTINCT fileID 
FROM (
SELECT file.fileID
FROM file
WHERE file.status = 1
ORDER BY file.fileID DESC
LIMIT 30
UNION ALL
SELECT visit.fileID
FROM visit
JOIN file ON file.fileID = visit.fileID
WHERE file.status = 1
ORDER BY visit.counter DESC
LIMIT 30
) dt
ORDER BY RAND()
LIMIT 10

作为对 OP 评论的回应,我在其中一个选择中添加了一个 JOIN 以检查与访问相关的文件是否具有状态 = 1。

另请注意:

要使此查询在大量数据上快速执行,您应该在字段 file.statusvisit.counter 上添加索引。如果 fileID 还不是这些表的键/索引,您也应该在此字段上添加索引。


visit.file_id 不是UNIQUE 所以上面的查询在第二个子查询的子结果中可能有相同的 file_ids(重复项将被删除final DISTINCT 但这意味着第二个 LIMIT 30 无法正常工作)。可能的更正:

SELECT DISTINCT fileID 
FROM (
SELECT file.fileID
FROM file
WHERE file.status = 1
ORDER BY file.fileID DESC
LIMIT 30
UNION ALL
SELECT visit.fileID
FROM visit
JOIN file ON file.fileID = visit.fileID
WHERE file.status = 1
GROUP BY visit.fileId
ORDER BY MAX(visit.counter) DESC
LIMIT 30
) dt
ORDER BY RAND()
LIMIT 10

关于MySQL 联合错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9195789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com