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

問題はここから始まります: FROM 1l900bk TO 2l900BKの項目を検索したいとします。それらの間のすべての 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"

Baraは "Bart" よりも小さく、Bartholomew (アルファベット順で Bart よりも大きい) ではないため、Baracus のような名前が付けられます。

したがって、2L900 が必要な場合は、必要な最大要素を設定する必要があります。つまり、2L900BR です。

バイナリ順序を参照してください

于 2012-10-01T13:58:05.377 に答える
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";
于 2012-10-01T14:00:45.020 に答える