2013-07-11 3 views
0

У меня есть запрос:MySQLi МЕЖДУ запрос, чтобы получить данные из текстовых fileds в базе данных

$sql = "SELECT * FROM table WHERE CONCAT(Prod, Serial) BETWEEN '$start' AND '$end'"; 

Где Prod и Последовательная сохраняются в базе данных MySQLi в виде строки. Мне нужно обновить детали пунктов между словами AA1000 и AA1005. Когда я запускаю этот запрос, он обновляет детали единиц между AA1000 и AA1005 и «как бонус» - все между AA10000 и AA10050. Есть ли способ получить точное соответствие для полей типа текста, используя запрос BETWEEN?

Спасибо!

P.S. Я знаю, что мне нужно обновить запрос для обновления сведений. Я использую SELECT для тестирования.

+0

У '$ start' и' $ end' всегда есть один и тот же алфавитный префикс, или они могут быть 'AA1000' и' BB1005'? – Barmar

+0

Является ли частью продукта '$ start' и' $ end' всегда ровно 2 символа? – Barmar

+0

может отличаться. Там есть целая куча их ..like bb dd da ma su и т. Д. –

ответ

0

Этот запрос должен это сделать:

SELECT * 
FROM TABLE 
WHERE Prod = LEFT('$start', 2) 
AND CAST(Serial AS DECIMAL) BETWEEN SUBSTRING('$start', 3) AND SUBSTRING('$end', 3); 

Вы также мог бы разделить начальные и конечные строки друга от друга в PHP:

$prod = substr($start, 0, 2); 
$start_code = substr($start, 2); 
$end_code = substr($end, 2); 

$sql = "SELECT * 
FROM TABLE 
WHERE Prod = '$prod' 
AND CAST(Serial AS DECIMAL) BETWEEN $start_code AND $end_code"; 
+0

Спасибо, Barmar, но устанавливая $ start как AA1500 и $ end, поскольку AA1503 возвращает 34 вместо 3 результатов ... –

+0

Какой тип данных является 'Serial'? Я предположил, что это «INT». – Barmar

+1

Я добавил 'CAST', чтобы решить эту проблему. – Barmar

1

Вы злоупотребляете синтаксисом BETWEEN очень плохо. Вы сравниваете строки, поэтому

'AA1000' <= 'AA10000' <= 'AA1005' 

действительно ИСТИНА, потому что вы не сравниваете числа, просто строки. Сравнение строк идут на основе каждого характера, без учета длины, так

'A' <= 'AZ' <= 'B' 

также верно, даже если человек будет считать «AZ» прийти ПОСЛЕ «B».

0

Я никогда не сталкивался с ситуацией, когда мне это нужно, но я считаю, что вы можете сделать это с помощью регулярных выражений. This may help you.

+0

Хотя можно выразить диапазон как регулярное выражение, это было бы очень сложно в общий случай. – Barmar

0

Вслед работал до сих пор:

CONVERT(SUBSTRING('$startunit', 3),UNSIGNED INTEGER) 

Всем спасибо!

 Смежные вопросы

  • Нет связанных вопросов^_^