对 SQL INNER JOIN 查询应用 LIMIT [重复]

Posted

技术标签:

【中文标题】对 SQL INNER JOIN 查询应用 LIMIT [重复]【英文标题】:apply a LIMIT to SQL INNER JOIN query [duplicate] 【发布时间】:2015-08-01 18:32:22 【问题描述】:

我有以下表格:

类别

    id(int)
    1000  
    1001

书籍

    id(int)  category(int) rating(float)
    3000     1000          5.0
    3001     1000          4.8
    3002     1000          3.0
    3003     1000          4.9
    3004     1001          4.9
    3005     1001          3.0

我想做的是从每个类别中选出 3 部评分最高的书籍。在环顾四周并按照LIMITing an SQL JOIN 给出的答案后,我尝试了这个查询。

    SELECT * FROM book, category WHERE book.category=category.id AND book.id IN (SELECT book.id FROM book ORDER BY rating LIMIT 3)

但它给出了以下错误

     #1235 - This version of mysql doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

解决方案说至少需要 MySQL 5.1,我正在运行 libmysql - 5.1.73。可能有什么问题?

【问题讨论】:

我刚刚提到它是因为我从 php 脚本运行此查询。我已经删除了,抱歉。 :) 查看此主题:***.com/questions/3333665/rank-function-in-mysql。您应该按类别对将它们进行分区的行进行排名,并选择排名 我需要在 2 个数据库上运行相同的查询,其中一个是在使用 SQLite 的 android 中。我可以在那里做吗? 【参考方案1】:

MySQL 抱怨的是IN,而不是LIMIT。将IN 更改为INNER JOIN,它应该可以工作。

类似这样的查询:

SELECT * FROM book b, category INNER JOIN (SELECT id FROM book ORDER BY rating LIMIT 3) v
ON b.id=v.id
WHERE b.category=category.id;

【讨论】:

对不起。我是 SQL 的初学者,我尝试用 INNER JOIN 替换 IN,即使看起来语法错误并且错误是这样的。 #1064 - 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 'INNER JOIN (SELECT book.id FROM book ORDER BY rating LIMIT 3) LIMIT 0, 30' at line 1 这个错误是#1054 - Unknown column 'book.category' in 'where clause' 编辑了答案,但为了帮助您编写正确的查询,我们需要知道您的表结构。 谢谢。 BOOK 表包含更多字段,但我相信它们没有任何用处,因为在此查询中,我只考虑评级和类别。 另外,您建议的查询给出了以下错误#1054 - Unknown column 'b.book.id' in 'on clause' 【参考方案2】:

对于某些子查询运算符,MySQL 不支持在子查询中使用LIMIT

'LIMIT & IN/ALL/ANY/SOME subquery'

例如

mysql> SELECT * FROM t1
    ->   WHERE s1 IN (SELECT s2 FROM t2 ORDER BY s1 LIMIT 1);
ERROR 1235 (42000): This version of MySQL doesn't yet support
 'LIMIT & IN/ALL/ANY/SOME subquery'

读取子查询limitation

【讨论】:

OP 已经知道该错误。【参考方案3】:

有一个技巧可以将LIMIT 3更改为LIMIT 0,3:像这样:

 SELECT * FROM book, category WHERE book.category=category.id 
        AND book.id IN (SELECT book.id FROM book ORDER BY rating LIMIT 0,3)

Source^^

【讨论】:

OP 想要“从 每个 类别中获取 3 部评分最高的书籍” 这不起作用。给出了同样的错误。 @SuhairZain 可以在更改限制后在评论中发布您的查询吗? 我完全按照您的建议进行了查询。 SELECT * FROM book, category WHERE book.category=category.id AND book.id IN (SELECT book.id FROM book ORDER BY rating LIMIT 0,3)

以上是关于对 SQL INNER JOIN 查询应用 LIMIT [重复]的主要内容,如果未能解决你的问题,请参考以下文章

sql用inner join内关联查询有多条记录一样只取一条?

多个INNER JOIN子查询sql

sql left join 和 inner join 效率

关于SQL 查询效率问题 left join 改成 inner join union

如何为多个 Inner Join 编写 SQL 查询?

多表查询-inner join left join right joinfull join