MySQL:如何查询多个表并仅对一个表应用LIMIT?

4
假设我有一张包含项目的表和另一张包含子项目的表。我想要返回与有限数量的项目相关联的所有子项目。本质上,我想要连接这两个查询:
SELECT * FROM subitem

SELECT * FROM item LIMIT 10

其中subitem.item = item.id

我尝试了以下代码:

SELECT * FROM subitem INNER JOIN item ON subitem.item = item.id LIMIT 10

然而,此查询仅返回10个子项(如您所预期)。我想检索所有子项,同时仅限制项目数量为10。我该如何实现?


你介意一个不确定的选择,还是在“LIMIT”之前应用一些排序? - eggyal
我需要对项目和子项目进行排序(为了简单起见,我在示例中省略了这一点)。 - David Jones
4个回答

5
这将给您返回10个项目。但是,为了获取您需要的项目,您应该添加一个WHERE子句和ORDER BY子句。
SELECT * FROM subitem INNER JOIN 
              (SELECT * FROM items LIMIT 10) AS I
              ON subitem.item = I.id 

这种方法比“WHERE IN(SELECT ...)”更好,因为它可以使用“subitem.item”上的索引。 - Vatev

3

请尝试以下查询:

select * from item,subitem where id = item and 
  id in (select id from item limit 10)

如果在 LIMIT 中使用 IN 出现问题,请尝试以下查询:

select * from (select id from item limit 10) as i1, subitem where id =item ;

我尝试了这个,但是出现了以下错误:错误代码:1235。这个版本的MySQL还不支持“LIMIT&IN / ALL / ANY / SOME子查询”。我检查了MySQL的版本号,它是5.5.24。 - David Jones
谢谢,那个方法可行。不过,我最终使用了多个JOIN语句,这让我可以将我的相当复杂的查询进行分区,并使其更易于阅读。据我所知,这两种方法的性能都差不多。 - David Jones

0
也许是这样的:
SELECT * FROM subitem WHERE item IN (SELECT id FROM item LIMIT 10);

-1

如何在此查询中使用限制

select tbl_thread.id,user_id,name,tbl_User.alert_flag,thread_name,thread_status,(select CAST(count(*) as UNSIGNED) from tbl_message where thread_id=tbl_thread.id AND read_status='0' and msg_from='EU' ) as unread,thread_timestamp,(select CAST(max(id) as UNSIGNED) from tbl_message where thread_id=tbl_thread.id) as max_id from tbl_thread,tbl_User where tbl_User.UserID=user_id ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接