2013-04-08 167 views
1

我正面臨一個獨特的挑戰。使用php和mysql高級排序和搜索mysql數據庫

我得到了一個100個號碼的表,名爲HUNDREDNUMBERS。 我想選擇最好的季度(75到100個數字), ,並將它們放入另一個名爲BESTQUARTER的表中。

我也想選擇最糟糕的季度(1到25號碼) 我想把它們放到另一個名爲WORSTQUARTER的表中。

這裏是我的MySQL的代碼,到目前爲止,

$Extract_Data = " 
CREATE TABLE $BESTQUARTER 
SELECT 
HUNDREDNUMBERS.number 
FROM 
HUNDREDNUMBERS order by 
HUNDREDNUMBERS.number desc LIMIT 25 "; 
$QuerySuccess = mysql_query($Extract_Data, $connection); 

和其他表....

$Extract_Data = " 
CREATE TABLE $WORSTQUARTER 
SELECT 
HUNDREDNUMBERS.number 
FROM 
HUNDREDNUMBERS order by 
HUNDREDNUMBERS.number asc LIMIT 25 "; 
$QuerySuccess = mysql_query($Extract_Data, $connection); 

的問題是,這個腳本,每次不是100%正確。 注意兩個查詢中的ASC和DESC。 這是一種嘗試對數字進行排序的巧妙方法。

順便說一下,HUNDREDNUMBERS表中的一些數字有小數點。 我需要兩個新表BESTQUARTER和WORSTQUARTER中的數據作進一步處理。

任何幫助是極大的讚賞

+1

當它是不是100%正確,會發生什麼? – 2013-04-08 12:51:21

+0

它返回錯誤的數字。例如BESTQUARTER表包含偶數小於25.因此WORSTQUARTERS包含的數字高於75 – lloyd 2013-04-08 12:54:31

+0

字段的類型是什麼decimal or varchar? – 2013-04-08 12:54:57

回答

0

如果你只有100個號碼,我會建議你創建一個級別的視圖,並用它進行後續處理。採用中間表,似乎有點小題大做:

select hn.*, 
     (select count(*) from hundrednumbers hn2 where hn2.number <= hn.number 
     ) as rank 
from HundredNumbers hn 

隨着hundrednumbers(number)索引,這甚至將有不俗的表現。

您可能遇到的問題在原始數據中是重複的。如果是這樣,查看隊伍可以幫助你找出在這種情況下要做什麼。

2

你正在做字符串比較,那些比數字數據類型遵循不同的規則;我建議改變你的排序表達式:

ORDER BY CAST(HUNDREDNUMBERS.number AS UNSIGNED) DESC|ASC 

相反UNSIGNED,你也可以使用SIGNEDDECIMAL(M, N)如果你需要分別支持負數或浮動點。

或者(最好),您可以將number列更改爲一種自行排序正確的類型;主要應該使用VARCHAR作爲文本。

1

您應該檢查數據類型。確保數字至少保存一位小數。其他數據類型可能導致排序關閉(並且是一個相當常見的錯誤)。這看起來很簡單,但你的代碼實際上從我的理解是這個問題看起來是正確的。

0

經過長時間的思考和測試,我相信我終於破解了它。

1)我將字段名「數字」更改爲DOUBLE UNSIGNED。 (最初我使用的是VARCHAR(50))

2)當您使用兩個或多個具有相同字段名稱的表格時,請將EVERY字段名稱作爲其表名。 我做到了這一點,它的工作,你將在下面的完整查詢中看到。

3)原始數據有多次出現的相同數字,即 ,即有數個行的值爲100的多個實例。 MySQL只將數值爲100的單行轉移到表BESTQUARTER中。 (我不知道爲什麼)。

uniqueid | id | numbers 
1 200 100 
2 6 100 
3 76 100 
4 64 99.009987655 
5 10 95.98765432 
6 11 11.98765432 
7 12 25.12 
8 13 53.173543 
9 153 72.87676 
10 32 99 

所以我添加了「GROUP By」並使用了ID字段。 (注:「UNIQUEID」列是主鍵,「身份證」是一個獨特的密鑰唯一標識每個數字)

這裏是新的代碼

create table BESTQUATER 
select 
HUNDREDNUMBERS.uniqueid , 
HUNDREDNUMBERS.id, 
HUNDREDNUMBERS.numbers 
FROM 
HUNDREDNUMBERS 
group by HUNDREDNUMBERS.id 
ORDER BY HUNDREDNUMBERS.numbers DESC LIMIT 25