2016-11-27 7 views
0

У меня есть поле для комментариев, используемых для хранения названия предмета, проданного на сайте, а также номера ставки (bid_id). К сожалению, bid_id не хранится отдельно в этой таблице.Запрос Mysql как число больше, чем x

Я хочу запросить элементы, у которых есть число (bid_id) более 4000, например.

Итак, что у меня есть:

select * from mysql_table_name where comment like '< 4000' 

Я знаю, что это не будет работать, но мне нужно что-то подобное, что работает.

Большое спасибо!

+1

хорошо, что пора лишить этого числа в свою собственную колонку в настоящее время не так: р – Drew

ответ

1

Просто получить вашу колонку bid_id очищены. Тогда индекс есть.

create table `prior` 
( id int auto_increment primary key, 
    comments text not null 
); 
insert `prior` (comments) values ('asdfasdf adfas d d 93827363'),('mouse cat 12345678'); 
alter table `prior` add column bid_id int; -- add a nullable int column 
select * from `prior`; -- bid_id is null atm btw 
update `prior` set bid_id=right(comments,8); -- this will auto-cast to an int 
select * from `prior`; 
+----+-----------------------------+----------+ 
| id | comments     | bid_id | 
+----+-----------------------------+----------+ 
| 1 | asdfasdf adfas d d 93827363 | 93827363 | 
| 2 | mouse cat 12345678   | 12345678 | 
+----+-----------------------------+----------+ 

Создать индекс:

CREATE INDEX `idxBidId` ON `prior` (bid_id); -- or unique index 
+0

Отлично работает! И больше не беспорядок :) – Duetschpire

+0

Geez не награждает меня очками, я просто ударил уродливую свалку там: p – Drew

+0

Почему вы не хотите этого? Это то, что я сделал (следующий комментарий) – Duetschpire

1

is ничего не готово, что работает так.

Вы можете написать пользовательскую функцию или loadable UDF, но это была бы значительная работа, оказывающая значительное влияние на базу данных. Затем вы можете запустить WHERE GET_BID_ID(comment) < 4000.

Что вы можете сделать более легко это придумать какой-то способ извлечения bid_id с помощью available string functions.

Например, если bid_id всегда находится в последних десяти символах, вы можете извлечь их и заменить все символы, которые не являются цифрами, нолями. Осталось bid_id и , которое вы можете сравнить.

Конечно, вам нужно сложное выражение с LENGTH(), SUBSTRING() и REPLACE(). Если bid_id находится между легко узнаваемыми разделителями, то, возможно, SUBSTRING_INDEX() - больше ваш друг.

Но лучше еще ... добавьте столбец INTEGER, инициализируйте его нулевым, , затем сохраните там извлеченный bid_id. Или ноль, если вы уверены, что нет bid_id. Наличие данных, хранящихся в смешанных контекстах, является злым (и известным антипаттерном SQL для загрузки). Как только у вас будет доступный столбец, вы можете выбрать каждые несколько секунд небольшое количество элементов с new_bid_id еще NULL и подвергнуть их извлечению, тем самым постепенно изменяя базу данных без перегрузки системы.

На практике

Это тот же подход можно было бы использовать более сложные случаи. Мы начинаем проверки то, что у нас есть (это тест стол)

SELECT commento FROM arti LIMIT 3; 

+-----------------------------------------+ 
| commento        | 
+-----------------------------------------+ 
| This is the first comment 100 200 42500 | 
| Another 7 Q 32768      | 
| And yet another 200 15 55332   | 
+-----------------------------------------+ 

Так что нам нужно последние символы:

SELECT SUBSTRING(commento, LENGTH(commento)-5) FROM arti LIMIT 3; 
+-----------------------------------------+ 
| SUBSTRING(commento, LENGTH(commento)-5) | 
+-----------------------------------------+ 
| 42500         | 
| 32768         | 
| 55332         | 
+-----------------------------------------+ 

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

... и все готово.

mysql> SELECT commento FROM arti WHERE SUBSTRING(commento, LENGTH(commento)-4) < 40000; 
+-------------------+ 
| commento   | 
+-------------------+ 
| Another 7 Q 32768 | 
+-------------------+ 

mysql> SELECT commento FROM arti WHERE SUBSTRING(commento, LENGTH(commento)-4) BETWEEN 35000 AND 55000; 
+-----------------------------------------+ 
| commento        | 
+-----------------------------------------+ 
| This is the first comment 100 200 42500 | 
+-----------------------------------------+ 

Проблема в том, что у вас есть номер не такой же длины (например, 300 и 131072).Затем вам нужно взять кусочек, достаточно большой для большего числа, и если число будет коротким, вы получите, возможно, «1 5 300» в своем фрагменте. Вот где SUBSTRING_INDEX приходит на помощь: захватив семь символов, от «131072» до «1 5 300», идентификатор всегда будет в последнем проемом, разделенном токеном фрагмента.

В ЭТОМ ПОСЛЕДНЕМ ДЕЛО, когда номера не имеют одинаковой длины, вы найдете проблему. Выделенные идентификаторы вовсе не являются номерами - для MySQL - строк. Это означает, что они сравниваются в лексикографическом, а не в численном порядке; и «17534» считается меньше, чем «202», так же, как «Алиса» приходит перед «Бобом». Чтобы преодолеть это, вам нужно указать строку как целое без знака, что еще больше замедлит работу.

WHERE CAST(SUBSTRING(...) AS UNSIGNED) < 4000 
+0

Спасибо за такой большой ответ! Bid_id, который я хочу запросить, составляет от 65000 до 8500 (там есть только около 100 записей, так как есть другие условия, которые необходимо выполнить), так что это всегда последние 6 символов в поле. Пример поля ниже: Возврат: карточка eGift newegg.com $ 50 49798 Не могли бы вы показать мне пример запроса, чтобы проверить последние 6 символов? – Duetschpire

1
select * from mysql_table_name where substring(comment,start,length, signed integer) < 4000 

Это будет работать, но я предлагаю создать новый столбец и поместить значение ставки в нем затем сравнить.

Чтобы обновить значение в новой колонке вы можете использовать

update table set newcol = substring(comment,start,length) 

Надеется, что это поможет

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