使用PDO设置LIMIT时忽略数据库重复

时间:2012-07-28 02:29:51

标签: php mysql pdo duplicates limit

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

更确切地说,我需要显示这些项目的清单,但要在右侧显示不同的价格。

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

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

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

3 个答案:

答案 0 :(得分:1)

您可以逐项分组,并使用GROUP_CONCAT显示不同的价格表?这样您仍然可以使用LIMIT 50。如果price列是数字,则将其强制转换为VCHAR。

答案 1 :(得分:1)

我不完全确定你在问什么,但我想你可能想要按照以下方式做一个总结陈述:

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

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

编辑:如果选择每个字段,则无法使用聚合函数。如果要选择其他不同的列,请按以下部分将它们添加到select和group:

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

答案 2 :(得分:0)

我承认我从其他答案中借用了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 in第一个示例和第二个示例中的5)。第二个限制将始终从0开始,如图所示。

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