1

首先,在写下 PHP 代码之前。我在 mySQL 数据库中有一个名为 items 的表。假设它在item_no中有以下记录:

  • 1L900BK
  • 1L900BE
  • 1L900BR
  • 2L900BK
  • 2L902BE
  • 2L910PU

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 />";    
}   
}

现在问题从这里开始:假设我想搜索一个从1l900bk2l900BK的项目,它将输出它们之间的所有 item_no ( 1L900bk 1L900BE ------- 2L900BK) 这是完美的!

但是当我想搜索 item_no FROM 1L9 TO 2L9 ...结果或输出不正确(1L900BK - 1L900BE - 1L900BR - 并停止!!) 2L900 的位置在哪里?当 for 循环达到此值时,它会跳过 2l9。

现在我只想在写下 2l9 时输出所有 2l900 ......我认为查询中的 BETWEEN 有问题,但我找不到替代方法。

谢谢你

4

2 回答 2

1

它停在那里,因为与字符串的比较是按字母顺序进行的。这意味着2L9小于2L900

1L9 <= foo <= 2L9 <2L900

在这种情况下,您将获得foo 。另一个例子可能是,

SELECT * FROM users WHERE name BETWEEN "A" and "Bart"

你会得到一个像 Baracus 这样的名字,因为Bara小于“Bart”,但不是 Bartholomew(按字母顺序大于 Bart)。

所以如果你想要 2L900,你必须设置你想要的最大可能元素,即2L900BR

请参阅二进制排序

于 2012-10-01T13:58:05.377 回答
1

结果是正确的"2L9" < "2L900BK"。它就像一本字典,你不希望以前找到adda是吗?

您应该尝试使用 的子字符串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";
于 2012-10-01T14:00:45.020 回答