首先,在写下PHP代码之前。我在mySQL数据库中有一个名为items的表。 假设它在 item_no :
中有以下reocrds,PHP代码是:
require_once('connect_db.php');
$from = $_POST['from'];
$to = $_POST['to'];
$query = "SELECT * FROM items WHERE item_no BETWEEN '".$from."' AND '".$to."' ORDER BY item_no Asc";
$result = mysql_query($query);
if(mysql_num_rows($result)>0){
$num = mysql_num_rows($result);
for($i=0;$i<$num;$i++){
$row = mysql_fetch_assoc($result);
echo $row['item_no'];
echo "<br /><br />";
}
}
现在问题从这里开始:假设我想搜索一个项目 1l900bk TO 2l900BK ,它将输出它们之间的所有item_no(1L900bk 1L900BE ---- --- 2L900BK)哪个是完美的!
但是当我想搜索item_no FROM 1L9 TO 2L9 ...结果或输出不正确(1L900BK - 1L900BE - 1L900BR - 并停止!! )2L900在哪里?当for循环达到此值时,它会跳过2l9。
现在我想要的是在我写下2l9时输出所有2l900 ...我认为BETWEEN在查询中有问题,但我找不到另一种方法。
谢谢
答案 0 :(得分:1)
它停在那里因为与字符串的比较是按字母顺序完成的。这意味着 2L9 小于 2L900 。
1L9 <= foo <= 2L9 <2L900
foo 就是这种情况下你会得到的。另一个例子可能是,
SELECT * FROM users WHERE name BETWEEN "A" and "Bart"
你会得到一个像Baracus这样的名字,因为 Bara 小于“Bart”,但不是Bartholomew(按字母顺序大于Bart)。
因此,如果你想要2L900,你必须设置你想要的最大可能元素,即 2L900BR
答案 1 :(得分:1)
结果是正确的,因为"2L9" < "2L900BK"
为真。它就像一本字典,你不希望在add
之前找到a
,对吗?
您应该尝试使用item_no
的子字符串,其长度等于$from
和$to
之间的最大长度:
$from = $_POST['from'];
$to = $_POST['to'];
$length = max(strlen($from), strlen($to));
$query = "SELECT * FROM items WHERE SUBSTRING(item_no, 1, ".$length.") BETWEEN '".$from."' AND '".$to."' ORDER BY item_no Asc";