【问题标题】:Is there a way to ORDER by REGEXP in MySQL statement?有没有办法在 MySQL 语句中通过 REGEXP 进行排序?
【发布时间】:2013-12-07 06:09:49
【问题描述】:

我有什么

SELECT CONCAT(`names`,' ',`office`) `bigDataField`
   FROM `item_table` 
HAVING `bigDataField` REGEXP "jessy|c";

还返回只包含字母“c”的数据,所以我想按大多数相同的匹配字符排序,这可能吗?

注意:用户输入会更改单词和字符。所以它可以只有一个字符或几个甚至几个单词。

sql 小提琴http://sqlfiddle.com/#!2/dc87e/1

感谢大家的帮助

【问题讨论】:

  • 需要什么顺序? 'ORDER BY most same chars' 是什么?
  • @AlmaDo 大多数相同的匹配字符。我更新了问题。现在这样有意义吗?
  • 按长度排序(bigdatafield) desc
  • @STTLCU 类似的东西会很棒,但不会改变任何东西...sqlfiddle.com/#!2/dc87e/13

标签: mysql


【解决方案1】:

您可以按任何表达式排序。

regexp 返回指定正则表达式的匹配数

所以,这个:

order by `bigDataField` regexp 'c' desc

将首先按照bigDataField 中包含最多cbigDataField 对您的数据进行排序,所以我猜这不是您要找的。您可以使用多个CASE-WHENs 来检查模式匹配的长度(警告:性能不佳 - 不建议用于大表)

试试这个

SELECT CONCAT(`names`,' ',`office`) `bigDataField`, 
  CASE WHEN CONCAT(`names`,' ',`office`) regexp 'jessy' > 0 then length('jessy') * (CONCAT(`names`,' ',`office`) regexp 'jessy') ELSE 
      CASE WHEN CONCAT(`names`,' ',`office`) regexp 'c' > 0 then length('c') * (CONCAT(`names`,' ',`office`) regexp 'c') ELSE 0 END
  END as charmatchcount

FROM `item_table` 
HAVING `bigDataField` REGEXP "jessy|c"
ORDER BY charmatchcount desc

为避免上述丑陋,您必须使用外部库,或创建自己的函数。你可能会发现这个帖子很有帮助MySQL - Return matching pattern in REGEXP query

【讨论】:

  • 谢谢,我更新了这个问题,因为我之前没有提到这一点。字符串'jessy|c'是由用户输入的,所以它会改变,所以sql查询必须一直改变。但是感谢您的链接,我会尝试使用它
  • 然后你可以在你的服务器代码(php或perl或其他)中创建sql查询,否则请参阅我发布的链接。
【解决方案2】:

你可以试试这个

SELECT CONCAT(`names`,' ',`office`) `bigDataField`
       FROM `item_table` 
HAVING `bigDataField` REGEXP '[a-z] c' order by bigDataField asc;

希望这对你有用

【讨论】:

  • 感谢您的回答,但我在这里没有看到任何订单。用户更改了 REGEXP 的“值”,因此它可以是几个字母或几个单词
  • 你可以通过bigDataField asc使用order;
  • 但是如果有几个单词和字母匹配呢?
【解决方案3】:

这行得通:

SELECT col, IF( LOCATE('Jessy', col) = 0, 0 , LENGTH('Jessy')) as ord
FROM
(
SELECT CONCAT( `names`,' ',`office`) `col`
       FROM `item_table` 
HAVING `col` REGEXP "jessy|c"
) x
ORDER BY ord DESC;

但如果 R​​EGEXP 中有 3 个单词,则很难找到相关查询。

顺便说一句,您在寻找全文搜索吗?

【讨论】:

  • 谢谢,我更新了这个问题,因为我之前没有提到这一点。字符串 'jessy|c' 是由用户输入生成的,因此它会发生变化,因此 sql 查询必须一直在变化
  • @caramba 那么他或她可以通过 'jessy|c|foo' 进行搜索吗?嗯。我想知道你是否集成了 MySQL 和搜索引擎。请看stackoverflow.com/questions/2271600/…
猜你喜欢
  • 2011-01-25
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 2019-12-29
相关资源
最近更新 更多