2

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

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

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

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

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

4

3 回答 3

1

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

于 2012-07-28T02:34:51.320 回答
1

我不完全确定你在问什么,但我认为你可能想要按照这些思路做一个汇总声明:

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
于 2012-07-28T02:35:07.750 回答
0

我承认我group_concat()从其他答案中借用了这个功能:)

文档中阅读本段后:

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在第一个示例和5第二个示例中)。第二个限制总是从0如图所示开始。

我喜欢在这方面工作,希望这会有所帮助。

于 2012-07-28T03:14:55.347 回答