Mysql查询的数字大于x

时间:2016-11-27 00:37:32

标签: mysql wordpress

我有一个评论字段,用于存储在网站上销售的商品的标题以及出价编号(bid_id)。不幸的是,bid_id并没有自己存储在该表中。

我想查询具有大于4,000的数字(bid_id)的项目。

所以,我所拥有的是:

location ~ ^/(assets)/ {
  gzip_static on;
}

我知道这不起作用,但我需要类似的东西。

非常感谢!

3 个答案:

答案 0 :(得分:1)

没有任何准备就绪。

您可以编写自定义函数或loadable UDF,但这将是一项重要工作,对数据库有重大影响。然后你可以运行WHERE GET_BID_ID(comment) < 4000

可以更轻松地做些什么,可以设法使用available string functions提取bid_id

例如,如果bid_id始终位于最后十个字符中,则可以提取这些字符,并将所有非数字字符替换为nil。剩下的是bid_id ,你可以比较。

当然,您需要一个包含LENGTH()SUBSTRING()REPLACE()的复杂表达式。如果bid_id位于容易识别的分隔符之间,则SUBSTRING_INDEX()可能更适合您的朋友。

但更好的是......添加一个INTEGER列,将其初始化为null,然后将提取的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                                  |
+-----------------------------------------+

看起来很好,但事实并非如此;在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拯救的地方:通过捕获7个字符,从“131072”到“1 5 300”,ID将始终是在切片的最后一个空格分隔标记中。

在此最后一种情况,当数字长度不同时,您会发现问题。提取的ID根本不是数字 - 对于MySQL,它们是字符串。这意味着它们在字典而不是数字顺序中进行比较;并且“17534”被认为小于而不是“202”,就像“爱丽丝”出现在“鲍勃”之前。要解决这个问题,您需要将字符串转换为无符号整数,这会进一步降低操作速度。

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

答案 1 :(得分:1)

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

这样可行,但我建议创建新列并将出价值放入其中然后进行比较。

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

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

希望这会有所帮助

答案 2 :(得分: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