解决方案 »
- 求问:如何用纯PHP抓取谷歌搜索出来的描述(即该链接的description)?
- php 用singlexml新建xml,如何使格式缩进?
- win7基于apache 的php环境搭建
- PHP随机生成汉字
- 在空间服务商那买了个mysql的空间,怎么把本地的表放上去?
- 请问在mysql中有类似msserver中的那种自动增长的字段类型吗?
- 请问为什么我在linux下发 mail() 的函数总是返回 false
- 怎么得到这种变量?$r1,$r2,$r3,$r4......(高分相送)
- 寻找php高手合作。
- php导出非乱码非乱序 奇葩问题求大神挫进来帮帮小弟
- 处理数组循环的问题,在线等
- 关于如何通过图片的URL在显示和上传问题
仅供参考
---------------------------------------------
如果表中某个字段是连续的,先取最小值和最大值,然后生成30个介于最小值和最大值之间的数值,最后再select xx from table where xx in (生成的30个数值)
仅供参考这两个方法都可以,各有优缺点。
方法一,数据库10万级的没问题,上百万级服务器就吃不消了,内存消耗太大。方法二,字段必须是连续的,如果有过删除的话 字段就不连续,用这个方法就会取到空值。但这个方法速度快,服务器开销很小。
大数据量下,比起使用SQL语句直接实现要快得多。
先取最小值和最大值,然后生成60个(也可50个或40个 视情况而定)介于最小值和最大值之间的数值,最后再select xx from table where xx in (生成的60个数值),然后去除掉空记录,取剩下的前30条。
如果剩下的不足30条,那就再次调用这个过程取记录,直到满足共30条记录为止。
你数据量大可以再帮我测试下
SELECT i.userid FROM (
SELECT @cnt := COUNT(*) + 1,
@lim := 30
FROM users
) vars STRAIGHT_JOIN(
SELECT r.*,
@lim := @lim - 1
FROM users r
WHERE (@cnt := @cnt - 1)
AND RAND() < @lim / @cnt
) i
SELECT i.userid FROM (
SELECT @cnt := COUNT(*) + 1,
@lim := 30
FROM users
) vars STRAIGHT_JOIN(
SELECT r.userid,
@lim := @lim - 1
FROM users r
WHERE (@cnt := @cnt - 1)
AND RAND() < @lim / @cnt
) i