2011-02-12 134 views
0

我正在使用php/mysql進行搜索。我的表是'高度'和數據類型= varchar(10)其中包含像(5英尺2英寸,5英尺3英寸,等等)。在尋找我的2個值 - height1身高2其基本範圍。我如何在範圍內搜索該表格?說 - 我會給範圍5英尺1英寸5英尺10英寸,並希望得到這些值之間的數據。我正在使用php。請幫我解釋一下。謝謝。MySQL搜索幫助

+0

你真的應該存儲所有的值在單個單元中,然後您可以轉換和格式化用於顯示。 – prodigitalson 2011-02-12 06:28:48

+0

其實我沒有權限修改表格。我正在努力工作。所以我必須在這種情況下做到這一點。任何想法? – 2011-02-12 07:20:45

回答

0

你應該真的像別人說並將其存儲爲一個整數值(英寸),所以5英尺10英寸是70

要顯示它作爲FT /再次,你只是做這樣的事:

$result = 70; //Whatever is retrieved from the DB really, in inches 
if($result >= 12) //If result is a foot or more 
{ 
    $feet = floor($result/12); //Divide the total inches by 12 and round down 
    $inches = $result % 12; //Modulus total inches by twelve to get remainder inches 
    $string = $feet . 'ft ' . $inches . 'in'; //Combine into string 
} 
else 
{ 
    $string = $result . 'in'; //Unless you want it to display 0ft 7in or whatever if less than a foot 
} 

你可以很容易地轉換所有的值在DB整數用一個簡單的腳本,從數據庫拉數據,拆分英尺和英寸分開,剪掉弦形部分(這可能只要將它們拆分後轉換爲int就可以完成),然後將英尺的數字部分乘以12並將其添加到英寸的數字部分並更新e DB。

會是這個樣子:

$sql = mysql_query("SELECT `id`,`height` FROM `table` WHERE 1"); 
while($row = mysql_fetch_assoc($sql)) 
{ 
    $values = explode(" ",$row['height']); //Split it into two parts at the space between feet and inches 
    $feet = (int)$values[0]; //Could also trim off the last 2 characters in the string 
    $inches = (int)$values[1]; 
    $total = ($feet * 12) + $inches; //Of course, given order of operations, the parentheses aren't necessary, but makes it look nicer 
    mysql_query("UPDATE `table` SET `height` = $total WHERE `id` = $row['id']"); 
} 

當然,你想要做的是讓餐桌上的新的空列,以保存新的整數值,像heightint什麼的,然後將舊列重命名爲其他內容,然後將新列重新命名爲高度。

好的,如果你沒有修改表的能力(你應該真的向你的客戶提出這樣的改進),我認爲你需要做的是查詢是這樣的:

SELECT * FROM `table` WHERE `height` >= '5ft 10in' AND `height` <= '5ft 1in' 

但是這樣的一個人說,5英尺10英寸會來5英尺1英寸中的數據類型之前,所以這會是很難找出哪個範圍應該是第一位的,哪些應該放在第二位,如果它是一個任意輸入,甚至不知道如果範圍超出一隻腳的話,它是否會捕獲所有的值。

然後,對它們進行排序的最簡單的方法可能是將高度轉換爲上述的總英寸數,然後使用PHP中的數據進行排序,使用您想要的任何數組排序功能。

2

我建議你以不同的方式存儲高度值。如果將它作爲浮點(5.1英尺等)或int(63英寸等)存儲,則可以輕鬆比較這些值。包含腳和英寸的字符串將更難以用mysql解析。

例如:
SELECT * FROM height WHERE rowHeight BETWEEN 12 AND 20

+0

沒有解決問題約束 – RichardTheKiwi 2011-02-12 07:30:33

0

由於您使用VARCHAR()來存儲你的高度數據,高度值存儲爲一個字符串。因此,要獲得一定範圍內的值,您必須先對數據進行排序。但是,由於您使用的是varchar(),因此按字母順序對列進行排序時,5ft 10in的值在5ft 1in之前。

因此,我建議你存儲的腳值和英寸值在2列整數,然後根據兩列,將給予英寸更高的優先級,以腳和較低的優先級排序數據。

然後,同時從結果集閱讀,只需在連接字符串「金融時報」和「在」您的數據。

+0

其實我沒有權限修改表。我正在努力工作。所以我必須在這種情況下做到這一點。任何想法? – 2011-02-12 07:21:40

1

它使生活變得複雜,但只要是單個數字,您就可以在「英寸」部分添加「0」。考慮到你正在儲存身高,讓我們忽略身高達到10英尺或更高的情況。

的樣本數據

create table height(height varchar(20) collate utf8_general_ci); 
insert height select '5ft 10in'; 
insert height select '6ft 1in'; 
insert height select '7ft 10in'; 
insert height select '8ft 1in'; 
insert height select '6ft 11in'; 
insert height select '7ft 2in'; 

Select聲明

select * 
from height 
cross join (select '5ft 9in' as low, '7ft 3in' as high) inputs 
where 
    case when height like '%ft _in' then 
    concat(left(height, instr(height,'ft')+2), '0', right(height,3)) else height end 
between 
    case when low like '%ft _in' then 
    concat(left(low, instr(low,'ft')+2), '0', right(low,3)) else low end 
and 
    case when high like '%ft _in' then 
    concat(left(high, instr(high,'ft')+2), '0', right(high,3)) else high end 

從本質上說,你插height1和身高2投入這部分

cross join (select '$height1' as low, '$height2' as high) inputs