Справка по поиску в MySQL - PullRequest
       13

Справка по поиску в MySQL

0 голосов
/ 12 февраля 2011

Я использую php / mysql для поиска. Моя таблица - 'высота' и тип данных = varchar (10) , который содержит значение типа (5 футов 2 дюйма, 5 футов 3 дюйма, ... и т. Д.), При поиске я получил 2 значения - height1 и height2 , которые в основном являются диапазонами. Как я могу искать в этой таблице с диапазонами? скажем - я дам диапазоны 5 футов 1 дюйм до 5 футов 10 дюймов и хочу получить данные между этими значениями. Я использую php . Пожалуйста, помогите мне об этом. Благодарю.

Ответы [ 4 ]

2 голосов
/ 12 февраля 2011

Я бы посоветовал вам хранить значения высоты по-другому.Если вы храните его как число с плавающей запятой (5,1 фута и т. Д.) Или целое число (63 дюйма и т. Д.), Вы можете легко сравнить значения.Строка, содержащая футы и дюймы, будет намного сложнее разобрать с помощью mysql.

Например:
SELECT * FROM height WHERE rowHeight BETWEEN 12 AND 20

1 голос
/ 12 февраля 2011

Это усложняет жизнь, но вы можете добавить «0» в «дюймовую» часть, когда она состоит из одной цифры.Учитывая, что вы сохраняете высоту, давайте проигнорируем случай, когда высота переходит в 10 футов или более.

Пример данных

create table height(height varchar(20) collate utf8_general_ci);
insert height select '5ft 10in';
insert height select '6ft 1in';
insert height select '7ft 10in';
insert height select '8ft 1in';
insert height select '6ft 11in';
insert height select '7ft 2in';

Select оператор

select *
from height
cross join (select '5ft 9in' as low, '7ft 3in' as high) inputs
where
  case when height like '%ft _in' then
    concat(left(height, instr(height,'ft')+2), '0', right(height,3)) else height end
between
  case when low like '%ft _in' then
    concat(left(low, instr(low,'ft')+2), '0', right(low,3)) else low end
and
  case when high like '%ft _in' then
    concat(left(high, instr(high,'ft')+2), '0', right(high,3)) else high end

По сути, вы подключаете входы height1 и height2 в эту часть

cross join (select '$height1' as low, '$height2' as high) inputs
0 голосов
/ 12 февраля 2011

Вы должны сделать то, что сказали другие, и сохранить его как одно целое число (в дюймах), поэтому 5 футов 10 дюймов - это 70.

Чтобы снова отобразить его как ft / in, вы просто делаете что-то вроде этого:

$result = 70; //Whatever is retrieved from the DB really, in inches
if($result >= 12) //If result is a foot or more
{
     $feet = floor($result / 12); //Divide the total inches by 12 and round down
     $inches = $result % 12; //Modulus total inches by twelve to get remainder inches
     $string = $feet . 'ft ' . $inches . 'in'; //Combine into string
}
else
{
     $string = $result . 'in'; //Unless you want it to display 0ft 7in or whatever if less than a foot
}

Вы можете довольно легко преобразовать все значения в БД в целое число с помощью простого скрипта, который извлекает данные из БД, разделяет футы и дюймы на части, обрезает строковую часть (что можно сделать, просто приведя int, когда они разделены), а затем умножает числовую часть футов на 12, добавляет ее к числовой части в дюймах и обновляет базу данных.

будет выглядеть примерно так:

$sql = mysql_query("SELECT `id`,`height` FROM `table` WHERE 1");
while($row = mysql_fetch_assoc($sql))
{
     $values = explode(" ",$row['height']); //Split it into two parts at the space between feet and inches
     $feet = (int)$values[0];  //Could also trim off the last 2 characters in the string
     $inches = (int)$values[1];
     $total = ($feet * 12) + $inches; //Of course, given order of operations, the parentheses aren't necessary, but makes it look nicer
     mysql_query("UPDATE `table` SET `height` = $total WHERE `id` = $row['id']");
}

Конечно, вам нужно создать новый пустой столбец в таблице для хранения новых целочисленных значений, например heightint или чего-то еще, а затем переименовать старый столбец во что-то другое, а затем переименовать новый столбец. к высоте наверное.

Ладно, если у вас нет возможности изменить таблицу (что вы действительно должны предложить для улучшения, кем бы ни был ваш клиент), то вам нужно будет выполнить запрос чего-либо, я думаю как:

SELECT * FROM `table` WHERE `height` >= '5ft 10in' AND `height` <= '5ft 1in'

Но, как сказал один человек, 5 футов 10 дюймов будут раньше, чем 5 футов 1 дюйм в этом типе данных, поэтому будет сложно определить, какой диапазон должен стоять первым, а какой - вторым, если это произвольный ввод, даже не уверен, что это поймало бы все значения, если бы диапазон был вне единственной ноги.

Тогда, вероятно, самый простой способ их сортировки - преобразовать высоту в полные дюймы, как указано выше, и отсортировать ее по PHP в любой другой функции сортировки массива.

0 голосов
/ 12 февраля 2011

Поскольку вы используете varchar () для хранения данных о высоте, значение высоты сохраняется в виде строки. Таким образом, чтобы получить значения между определенным диапазоном, вы должны сначала отсортировать данные. Но поскольку вы используете varchar (), при сортировке столбца в алфавитном порядке значение 5ft 10in предшествует 5ft 1in.

Поэтому я предлагаю вам сохранить значения футов и дюймов в виде целых чисел в 2 столбцах, а затем отсортировать данные по обоим столбцам, отдавая более высокий приоритет футам и меньший приоритет дюймам.

Затем, читая ваш набор результатов, просто объедините строки 'ft' и 'in' с вашими данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...