【问题标题】:Select n rows without LIMIT mysql选择没有LIMIT mysql的n行
【发布时间】:2011-08-08 08:17:50
【问题描述】:

我有问题。我想在不触及 LIMIT 的情况下从表中只获取 300 行。我需要 LIMIT 进行分页。这在 MySQL 中可行吗?

我当前的查询:

SELECT a.title, a.askprice, a.picture, a.description, a.userid, a.id 
    FROM mm_ads AS a WHERE a.category = 227 AND a.status = 1 
    ORDER BY id DESC LIMIT 40,20

编辑:

简单解释:我需要从系统中获取最后 300 个广告,但我需要保持分页,因为我不想在一页中列出 300 行..

【问题讨论】:

  • 您为什么要收集比页面上容纳的更多的记录?如果您需要显示记录 20 到 40,则不需要收集其他 280 条记录....
  • 我猜你必须提供更多信息,而不是暗示一个不可用的解决方案而不说明它的用途。
  • 您可以将 LIMIT 用于分页和限制整体结果集,只需不查询超过限制的页面或在限制不适合分页边界时修剪结果长度。 不要编写一个复杂的查询来将两者分开(或者给出一个非常好的理由这样做)。
  • 您对哪 300 行感兴趣?总是前 300 个?
  • @hakre:是的,我需要前 300 行..

标签: php mysql limit


【解决方案1】:
SELECT *
FROM (
   SELECT a.title, a.askprice, a.picture, a.description, a.userid, a.id 
   FROM mm_ads AS a 
   WHERE a.category = 227 AND a.status = 1 
   ORDER BY id DESC 
   LIMIT 300
) t
LIMIT 40,20

如果目的是为了加快查询速度,那么可以创建复合索引:

ALTER TABLE `mm_ads` 
    ADD INDEX `mm_ads_index` (`category` ASC, `status` ASC, `id` DESC);

【讨论】:

  • 你到底为什么要这么做...?
  • @hoppa 我不知道。这只是对他的问题的直接回答:)
  • 从语义上讲,这是一个正确的答案,是的,但它使查询变得过于复杂,这根本没有必要。
  • @Karolis 感谢您的快速回复和直接回答,但此查询太慢了。我有 50 000 多行,所以我需要专注于速度性能。
  • @Puzo 所以您想将结果集限制为 300 行,因为您想加快查询速度?这是目的吗?
【解决方案2】:

在 SELECT 之后使用 SQL_CALC_FOUND_ROWS:

SELECT SQL_CALC_FOUND_ROWS *

编辑:

在 php 中,运行这一行来获取行数:

list($int_rows) = mysql_fetch_row(mysql_query("SELECT FOUND_ROWS()"));

这将遍历所有行,获取总金额,但不会获取所有行。

编辑2:

可能误解了您的问题,但这是分页的常见解决方案。

【讨论】:

  • 感谢您分享您的解决方案.. 但我不认为,这就是我要找的..
【解决方案3】:

简单的解决方案是 Fits 仅计算您需要的结果数量并将其用于分页 然后在查询中使用限制在每个页面上加载数据

选择 a.title、a.askprice、a.picture、a.description、a.userid、a.id 从 mm_ads 作为其中 a.category = 227 AND a.status = 1 ORDER BY id DESC LIMIT 40,20

不管你的数据库有多大,它只会给你 20 个结果(尽管它会搜索完整的数据库)

【讨论】:

    【解决方案4】:

    您可以做的另一件事是从数据库中获取所有 300 行并将其保存在一个数组中,然后对数组索引进行分页

    【讨论】:

      猜你喜欢
      • 2014-11-12
      • 2012-04-10
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 2010-10-09
      相关资源
      最近更新 更多