2012-02-08 137 views
0

为什么我得到这个查询这个错误?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 

错误:

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限制。

+3

更好地解释你想用这个查询来实现什么。我可以指出解析错误的位置,但查询尖叫声中存在更严重的误解。 – Kaii 2012-02-08 15:04:34

+0

对不起,我不清楚,我想要的是选择前30名最多查看文件和前30名最近的文件,然后从文件状态= 1随机选择限制10。 – xiomai 2012-02-08 15:07:22

+0

做两个表'文件' 'visit'有'status'列吗? – 2012-02-08 15:30:56

回答

2

把为最新文件的两个查询和大多数访问在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(重复的将被最后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 
+0

状态行只在**文件**表中,而不在**访问**。 – xiomai 2012-02-08 15:14:05

+1

固定。那么它就更多地属于子查询而不是外部。 – Kaii 2012-02-08 15:16:58

+0

对不起,但** dt **代表您的代码是什么意思? – xiomai 2012-02-08 15:22:05

0

你想用这个查询做什么?我认为,还有更多的解析错误。

我不知道如果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 
+0

这是否意味着您的R1.rand()会随机选择20个联合结果? – xiomai 2012-02-08 15:12:06

0

试试这个,你需要括号关闭选择。

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 
+0

1.每个派生表(子查询)必须有一个别名2.在可以应用WHERE原因的子查询之外不存在结果字段状态 – Kaii 2012-02-08 15:14:58

+0

我试过了,但我得到了这个。 **每个派生表都必须有自己的别名**。我知道我应该把**作为**的地方,但我不知道在哪里。 – xiomai 2012-02-08 15:17:30

+0

@ xiomai是的,我错过了别名,修复。 – xdazz 2012-02-08 15:18:11