2010-10-21 23 views
7

这是我原来的查询......是否有在MySQL的子查询中使用LIMIT的解决方法?

SELECT `id` 
    FROM `properties` 
LIMIT 10, 20 

LIMIT条件是分页。

现在,我必须得到像以前一样,但我只需要得到条件存在的行的三分之一。

我想出了这个,就在之前我想通了,该怎么办扔LIMIT 30(共行匹配/ 3)* 2

SELECT `id` 
    FROM `properties` 
WHERE `id` NOT IN (SELECT `id` 
         FROM `properties` 
        WHERE `vendor` = "abc" 
        ORDER BY RAND() 
        LIMIT 30) 
LIMIT 10, 20  

MySQL表示...

1235 - 该版本的MySQL还不支持 'LIMIT & IN/ALL/ANY/SOME子查询'

我想我不能使用LIMIT在子查询中。

所以这是一个多问题,但所有相关的...

  • 是否有子查询LIMIT一个解决方法吗?
  • 我可以在MySQL中选择1/3的匹配行吗?
  • 我是否需要将它变成2个查询,或者只是选择全部并取消设置PHP中不需要的行?
+1

是弹簧想到一个明显的一点是,*随机的结果*和*分页*真的不一起去... – deceze 2010-10-21 04:08:39

+0

@deceze是的,我想到,当在PHP中做它。所以我只拿到了前三分之一。 – alex 2010-10-21 04:25:37

回答

4

如果你的MySQL版本不支持,那么你有2种选择:

  • 升级。总是很有趣,最好是最新版本。
  • 打破你的子查询使用PHP。获取ID,然后将结果格式化为逗号分隔的字符串。
+0

在共享主机上,所以无法升级。不过,我是用PHP做的。 :) 感谢您的回答。 – alex 2010-10-21 04:30:16

1

MySQL在子查询中支持LIMIT ...但MySQL不支持在子查询中使用IN/NOT IN。

说实话,我真的不知道你在做什么。

+0

只是客户的一个奇怪的请求 - “我想显示所有属性,但只有特定供应商的随机1/3”。 – alex 2010-10-21 04:26:49

15

对不起,我迟到,这个工作对我来说:

SELECT p.id 
    FROM properties p 
LEFT JOIN (SELECT t.id 
      FROM PROPERTIES t 
      WHERE t.vendor = 'abc' 
     ORDER BY RAND() 
      LIMIT 30) x ON x.id = p.id 
    WHERE x.id IS NULL 
    LIMIT 10, 20 
+0

感谢OMG Ponies,它已经在PHP中做过了,但我会从中学到一些东西。 +1 – alex 2010-10-21 04:37:11

+0

这是最好的答案!完全为我工作 – 2014-06-04 15:51:03

相关问题