【问题标题】:Regular Expression where a number is less than 10数字小于 10 的正则表达式
【发布时间】:2018-11-23 17:22:22
【问题描述】:

我有一个表,其中有一列以这种方式存储数据:

1:29,3:20,5:0,4:0,2:76

我想在 PHP(或一般的 MySQL)中发出查询请求,并获取 " : " 之后数字小于 10 的行。

因此,在这种情况下,我有( 29 , 20 , 0 , 0 , 76 ),并且因为我有一个小于 10 的数字,所以我想占据这一行。

【问题讨论】:

  • 当您需要检查序列化中的单个值时,不要存储序列化值。将它们分解到自己的表中并正常查询。
  • 这样的模式明显违反了Zero, One or Infinity Ruledatabase normalization。如果可能,请尝试将其重组为一对多的关系结构,因为这将使您的查询几乎是微不足道的。

标签: php mysql regex


【解决方案1】:

一般来说,在 SQL 中存储逗号分隔值并不是一个好的设计,因为它会导致违反数据规范化规则,此外还会面临许多其他问题。但是既然你已经完成了并且想要一个正则表达式来解决你的问题,你可以使用这个正则表达式,

:[0-9](,|$)

Here is a demo

在mysql中你可以这样写查询,

select * from tablename where columnname regexp ':[0-9](,|$)';

这将为您提供在冒号后面至少有一个逗号分隔值小于 10 的行。

【讨论】:

  • 我使用的是opencart系统,这是一个模块,所以我无法重新设计它。非常感谢!
  • 好的,在这种情况下,您无能为力。希望我的正则表达式对你有用。如果您遇到任何问题,请告诉我。
  • 它就像魅力一样工作。但我刚刚意识到我需要一种方法来对结果进行排序。我的意思是,当我得到行时,我想根据这个正则表达式在 ASC/DESC 中订购产品( 5:[0-200](,|$)) - > 5 将是一个将从中选择的数字一个下拉菜单
  • 可以按列的值排序,但不要认为您可以按正则表达式的值排序。在您的情况下,由于该列存储逗号分隔值,因此您可能希望排序会变得更加困难。
  • 实际上我尝试使用 :[0-200](,|$) 但它不适用于你在这里玩我的例子link
猜你喜欢
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 2019-10-06
相关资源
最近更新 更多