【问题标题】:Mysql: Order results accrording to the number of matches in a WHERE clause?Mysql:根据WHERE子句中的匹配数对结果进行排序?
【发布时间】:2015-08-10 16:01:40
【问题描述】:

是否可以根据 WHERE 子句中的匹配数MYSQL 查询的结果进行排序(DESC), 已被多个 OR 运算符分隔?

我想对以下查询执行此操作:

SELECT column_1, column_2, column_2
FROM tbl_table 
WHERE column_1 LIKE '%$string1%' 
OR column_2 LIKE '%$string2%' 
OR column_3 LIKE '%$string3%'
ORDER BY ... "

【问题讨论】:

标签: php mysql sql-order-by where-clause


【解决方案1】:

您可以这样使用 SUM() 和 GROUP BY:

选择 column_1、column_2、column_3、 SUM(IF(column_1 LIKE '%$string1%', 1, 0)) as S1, SUM(IF(column_2 LIKE '%$string2%', 1, 0)) as S2, SUM(IF(column_3 LIKE '%$string3%', 1, 0)) as S3 来自 tbl_table WHERE column_1 LIKE '%$string1%' 或 column_2 LIKE '%$string2%' 或 column_3 LIKE '%$string3%' 按列_1、列_2、列_3分组 按 S1 DESC、S2 DESC、S3 DESC 排序

【讨论】:

  • 我不确定 SUM 在这里是否有意义。如果 column1 匹配,您将只获得 (column_1, column_2, column_3) 在 S1 的表中出现的次数; S2 和 S3 类似。对于 S1、S2、S3,您将获得 COUNT(*) 或 0。
  • 如果 column_1 匹配,则 IF 评估为 1,如果不匹配,则为 0。然后分组使用这些的总和,这将说明总共有多少 column_1 匹配。
  • 但是您的分组将意味着您获得 0 或 column_1、column_2 和 column_3 具有相同值的行数;不是有多少行与 column_1 匹配。
【解决方案2】:

这是我知道的唯一方式:

SELECT column_1, column_2, column_2
, IF(column_1 LIKE '%$string1%', 1, 0)
  + IF(column_2 LIKE '%$string2%', 1, 0) 
  + IF(column_3 LIKE '%$string3%', 1, 0)
  AS matchCount
FROM tbl_table 
WHERE column_1 LIKE '%$string1%' 
  OR column_2 LIKE '%$string2%' 
  OR column_3 LIKE '%$string3%'
ORDER BY matchCount DESC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 2011-02-10
    相关资源
    最近更新 更多