簡體   English   中英

MySQL查詢像數字大於x

[英]Mysql query like number greater than x

我有一個評論字段,用於存儲網站上出售的商品的標題以及出價編號(bid_id)。 不幸的是,bid_id並未單獨存儲在該表中。

例如,我要查詢數字(bid_id)大於4,000的項目。

所以,我有:

select * from mysql_table_name where comment like '< 4000'

我知道這行不通,但是我需要類似的東西。

非常感謝!

沒有什么現成的作品那樣。

您可以編寫一個自定義函數或可加載的UDF ,但這將是一項巨大的工作,對數據庫有重大影響。 然后,您可以運行WHERE GET_BID_ID(comment) < 4000

可以更輕松地做的是設計一種使用可用字符串函數提取bid_id方法。

例如,如果bid_id始終位於最后十個字符中,則可以提取這些字符,並將所有非數字字符替換為nil。 而剩下的是bid_id你可以比較。

當然,您需要使用LENGTH()SUBSTRING()REPLACE()的復雜表達式。 如果bid_id在容易識別的分隔符之間,則SUBSTRING_INDEX()可能更適合您。

但是最好還是...添加一個INTEGER列,將其初始化為null, 然后將提取的bid_id存儲在bid_id 或為零(如果您是肯定的),則沒有bid_id 將數據存儲在混合上下文中是有害的(並且要引導一個已知的SQL反模式)。 一旦擁有了可用的列,就可以每隔幾秒鍾選擇少量帶有new_bid_id仍為NULL的項目, new_bid_id進行提取,從而逐步修改數據庫而不會導致系統超載。

在實踐中

這與在更復雜的情況下使用的方法相同。 我們首先檢查一下我們擁有的(這是一個測試表)

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                                  |
+-----------------------------------------+

看起來不錯,但事實並非如此; ID之前還有多余的空間。 因此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”的七個字符,ID將始終位於slice的最后一個空格中

在最后一種情況下 ,當數字的長度不同時,您會發現問題。 提取的ID根本不是數字,對於MySQL來說,它們是字符串 這意味着它們按字典順序而不是數字順序進行比較; 和“17534”被認為比“202” 更小 ,就像“愛麗絲”來“鮑勃”之前。 為了解決這個問題,您需要將字符串轉換為無符號整數,這會進一步降低操作速度。

WHERE CAST( SUBSTRING(...) AS UNSIGNED) < 4000
select * from mysql_table_name where substring(comment,start,length, signed integer) < 4000

這將起作用,但是我建議創建一個新列,並將出價值放入其中,然后進行比較。

要更新新列中的值,您可以使用

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

希望這會有所幫助

只需清理您的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM