2014-06-26 114 views
0

我需要查詢幫助。我正在接受來自用戶的輸入,他們在1-100之間輸入範圍。所以它可能像30-40或66-99。然後,我需要一個查詢來從具有high_range和low_range的表中提取數據,以找到與其範圍內的任何數字匹配的數據。兩個範圍之間的MySQL查詢

因此,如果用戶做了30-40,並且該表有1-80,21-33,32-40,40-41,66-99和1-29的條目,它會發現除最後兩個在桌子裏。

什麼是最容易做到這一點的原因是什麼?

感謝

+1

SELECT * FROM table WHERE ID 30 and 40; – Farkie

+0

@Farkie看起來你有正確的答案。 '選擇*從表WHERE(30至40之間的高範圍或30至40之間的低範圍)' – T3chn0crat

+0

:)要我發佈爲正式答案嗎? – Farkie

回答

1

如果我理解正確的(例如,你希望重疊由用戶輸入的任何一個範圍),我會說:

SELECT * FROM table WHERE low <= $high AND high >= $low 
+0

不太清楚爲什麼我的回答落選,我相信它確實是OP要求的。當然,低位和高位是表格列,高位和低位是用戶輸入。 – jcaron

+0

我沒有downvoted,但我認爲我們可以使用'BETWEEN'運營商,因爲OP要包含數據,但無論如何你的答案是正確的。 – Rahul

+0

@Rahul,如果您比較3個值(即,對一個範圍的一個值),則BETWEEN可以工作。這裏我們有4個比較(2個範圍)。 – jcaron

0

我明白那是什麼範圍存儲以這種格式low-high。如果是這樣的話,那麼這是一個糟糕的設計。我建議將這些值分成兩列:lowhigh

如果你已經擁有的價值觀分裂,你可以用這樣的一些語句:

SELECT * FROM myTable WHERE low <= $needleHigherBound AND high >= $needleLowerBound 

如果您有存儲在一個列中的值,並堅持他們留下的話,你可能會發現的MySQL SUBSTRING_INDEX功能有用。但在這種情況下,您必須編寫一個複雜的查詢來解析所有行的所有值,然後將它們與您的搜索值進行比較。掩蓋設計缺陷似乎需要很多努力。

-1

SELECT * FROM table WHERE ($low BETWEEN low_range AND high_range) OR ($high BETWEEN low_range AND high_range)

+0

這是不正確的。如果$ low爲0,$ high爲100,那麼您的查詢將不會返回上表中的任何值(因爲$ low和$ high都不在這些範圍內)。你所描述的是包含用戶範圍的所有範圍的選擇,而不是所有與它相交的範圍。 – jcaron