2012-07-28 39 views
2

當我將設置我的「限制0,50」,然後「限制50,50」然後限制.....我將需要在數據庫中忽略重複項只掃描我的表的一列上的副本,而不是一次掃描所有的列。我無法合併重複項,因爲它們在某種程度上有所不同:這些重複項具有不同的價格。當設置限制與PDO時忽略數據庫重複

更準確地說,我需要顯示這些項目的清單,但要在右側顯示不同的價格。

我需要一個精確的數字(50)每頁,所以我不能加載更少,然後轉到下一頁。因此,我可以加載更多的從一開始(改變最大和以前的偏移,如果我是一個遠頁)的方式,如果我忽略重複的,我會得到每個頁面正好50,我會得到很好的頁數顯示在最後。

我是一個PHP的初學者,我不知道該怎麼做。也許預先掃描所有的表格,然後開始編寫我的代碼,靈活使用LIMIT的掃描變量和所有內容?我需要什麼功能?怎麼樣 ?

否則,做一些預先編程的或者我不知道它存在的php函數可以解決這個問題嗎?或者我真的需要頭戴一個xD

回答

1

我不能完全肯定的,你問什麼,但我想你可能想要做沿着這些路線一合計聲明:

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

這將帶回的50項列表和第二列所有的價格都集中在一起。然後在你的PHP代碼,你可以explode()是第二列保持原樣。

編輯:如果您選擇每一個領域,你不能再使用聚合函數。如果您想選擇其他列不會是不同的,他們既添加到選擇和這樣的組由部分:

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

我可以選擇這樣的: 選擇 *,GROUP_CONCAT(ITEMPRICE),而有問題 的「*」,這已經包括了「ITEMPRICE」,這是我後直接設置與GROUP_CONCAT()? – 2012-07-28 04:36:43

+0

我不太清楚你的意思。你剛剛寫的查詢似乎沒有意義。 「*」的問題是什麼意思? – Fluffeh 2012-07-28 04:39:45

+0

我剛剛編輯我的帖子,堆棧溢出改變了我的「*」符號爲「」(只是沒有) – 2012-07-28 04:41:32

1

大概你可以按項目分組,並用GROUP_CONCAT來顯示不同的價目表?這樣你仍然可以使用LIMIT 50。如果價格列是數字,則將其轉換爲VCHAR。

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和第二個例子中的5 )。第二個限制總是從0開始,如圖所示。

我很享受這方面的工作,希望這有助於。