【问题标题】:Ignore the database duplicates when setting LIMIT with PDO使用 PDO 设置 LIMIT 时忽略数据库重复项
【发布时间】:2012-07-26 17:17:10
【问题描述】:

当我设置“LIMIT 0, 50”,然后设置“LIMIT 50, 50”,然后设置 LIMIT 时,我想忽略数据库中的重复项.....我只需要扫描 1 列的重复项我的表,而不是一次所有的列。我无法合并重复项,因为它们在某种程度上有所不同:这些重复项具有不同的价格。

更准确地说,我需要显示这些商品的列表,但要在右侧显示它们的不同价格。

每页我需要一个精确的数字 (50),所以我不能加载更少然后转到下一页。因此,我可以从头开始加载更多内容(如果我在远页面上,则更改最大和以前的偏移量),如果我忽略重复项,我将每页恰好 50 个,并且我会得到很好的页数显示在最后。

我对 PHP 有点初学者,我不知道如何去做。也许预扫描所有表,然后开始编写我的代码,通过灵活使用我的扫描变量 LIMIT 和所有内容?我需要什么功能?怎么样?

否则,做一些预编程的东西或者我不知道它存在的php函数可以解决这个问题吗?或者我真的需要头痛xD

【问题讨论】:

    标签: php mysql pdo duplicates limit


    【解决方案1】:

    或许您可以按商品分组,并使用GROUP_CONCAT 显示不同的价格表?这样你仍然可以使用LIMIT 50。如果价格列是数字,则将其转换为 VCHAR。

    【讨论】:

      【解决方案2】:

      我不完全确定您在问什么,但我认为您可能希望按照以下思路进行汇总:

      select
          itemID,
          group_concat(itemPrice)
      from
          yourTable
      group by
          itemID
      limit 50
      

      这将返回一个包含 50 个项目的列表和第二列,其中所有价格都组合在一起。然后在您的 PHP 代码中,您可以explode() 第二列保持原样。

      编辑:如果您选择每个字段,则不能使用聚合函数。如果您想选择其他不会有所不同的列,请将它们添加到 select 和 group by 部分,如下所示:

      select
          itemID,
          itemName,
          itemSomething,
          itemSomethingElse,
          group_concat(itemPrice)
      from
          yourTable
      group by
          itemID,
          itemName,
          itemSomething,
          itemSomethingElse
      limit 50
      

      【讨论】:

      • 我可以像这样选择:SELECT *, group_concat(itemPrice) 而不会对已经包含“itemPrice”的“*”产生问题,我在 group_concat() 之后直接设置了它?跨度>
      • 我不太清楚你的意思。您刚刚编写的查询似乎没有意义。 "" 的问题是什么意思?
      • 我刚刚编辑了我的帖子,堆栈溢出将我的“*”符号更改为“”(什么都没有)
      • 不,你不能那样做。为您在我的帖子中添加编辑。
      【解决方案3】:

      我承认我从其他答案中借用了group_concat() 函数:)

      看完这段话来自docs

      The default behavior for UNION is that duplicate rows are removed from the result.
      The optional DISTINCT keyword has no effect other than the default because it also
      specifies duplicate-row removal. With the optional ALL keyword, duplicate-row removal
      does not occur and the result includes all matching rows from all the SELECT statements.
      

      假设如下表(testdb.test):

      ID  Name    Price
      1   Item-A  10
      2   Item-A  15
      3   Item-A  9.5
      4   Item-B  5
      5   Item-B  4
      6   Item-B  4.5
      7   Item-C  50
      8   Item-C  55
      9   Item-C  40
      

      您可以分页此表的行(9 行)或组(3 组,根据项目的名称)。

      如果您想根据项目组对项目进行分页,这应该会有所帮助:

      SELECT 
          name, group_concat(price)
      FROM
          testdb.test
      GROUP BY name
      LIMIT 1 , 3 
      UNION SELECT 
          name, group_concat(price)
      FROM
          testdb.test
      GROUP BY name
      LIMIT 0 , 3; -- Constant 0, range is the same as the first limit's
      

      如果您想根据所有项目对项目进行分页(我认为这不是您所要求的,但以防万一它对其他人有所帮助),这应该会有所帮助:

      SELECT 
          name, price
      FROM
          testdb.test
      LIMIT 1 , 5 
      UNION SELECT 
          name, price
      FROM
          testdb.test
      LIMIT 0 , 5; -- Constant 0, range is the same as the first limit's
      

      需要注意的一个非常重要的事情是您必须如何修改限制。第一个限制是您的关键,您可以从您想要的任何限制开始,只要它是 count(*) 但您必须具有与第二个限制相同的范围(即第一个示例中的 3 和 @ 987654330@ 在第二个例子中)。如图所示,第二个限制将始终从0 开始。

      我很喜欢这方面的工作,希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2011-09-24
        • 2012-05-23
        • 1970-01-01
        • 2018-07-07
        • 1970-01-01
        • 1970-01-01
        • 2011-07-27
        • 2017-10-25
        • 1970-01-01
        相关资源
        最近更新 更多