MySQL联合错误

MySQL联合错误,mysql,union,Mysql,Union,为什么这个查询会出现这个错误 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 错误: 您的SQL语法有错误;检查手册 对应于您的MySQL服务器

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

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
错误:

您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 第1行“其中状态=1按兰德订购()限制10”附近


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

您希望如何处理此查询?我认为,有更多的解析错误

我不知道MySQL是否接受了这个。。如果这是你想做的

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

将对最新文件和最多访问的两个联合查询放在子查询中,然后按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
作为对OPs评论的回应,我在其中一个选择中添加了一个连接,以检查与访问相关的文件的状态是否为1

另请注意:

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


visit.file\u id
不是唯一的
UNIQUE
,因此上述查询在第二个子查询的子结果中可能具有相同的文件id(重复项将由最终的
DISTINCT
删除,但这意味着第二个
限制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

尝试此操作,您需要使用括号来关闭select

SELECT DISTINCT fileid
FROM   ((SELECT fileid, status 
         FROM   FILE
         ORDER  BY fileid DESC
         LIMIT  10)
        UNION
        (SELECT fileid, status 
         FROM   visit
         ORDER  BY counter DESC
         LIMIT  10)) AS T
WHERE  status = 1
ORDER  BY Rand()
LIMIT  10 

更好地解释您希望通过该查询实现什么。我可以指出解析错误的位置,但查询显示其中存在更严重的误解。抱歉,我不够清楚,我想要的是选择查看次数最多的前30个文件和最近的前30个文件,然后从中随机选择限制为10的文件,文件状态为1。这两个表
file
visit
是否都有
status
列?@ypercube否,visit表上的fileid与音频表的fileid相关。visit是否为每次访问保留一行?
visit.counter
是一个自动递增字段吗?这是否意味着所有20个联合结果都将使用R1.rand()随机选择?状态行仅在文件表中,而不是在visit.fixed上。然后它更属于子查询内部而不是外部。这是派生表的别名。这是mysql所需要的。也可以写为
(选择…)作为dt
。。在这种情况下,
AS
是可选的。访问表上的文件ID与音频表的文件ID相关,我还想检查访问时的文件ID是否设置为1。我还修复了上面括号的代码。我不知道你指的是哪个括号,唯一需要的括号已经在我的答案中了。。要检查
文件
行是否与
相关,请访问
,您需要使用联接。。我在最近的编辑中添加了这个。每个派生表(子查询)必须有别名2。在子查询之外没有结果字段状态,可以在该子查询上应用WHERE原因,但我得到了这个结果。每个派生表都必须有自己的别名。我知道我应该放在某个地方,但我不知道放在哪里。@xiomai Yep,我错过了别名,已修复。现在我在
where子句中得到**未知列
status
。我尝试使用audio.status或t.status,但仍然得到相同的错误。@xiaomai是的,您必须在子查询中选择status out,是否在这两个表中?