mysql - 使用 GROUP_CONCAT 时如何按匹配的字段数对行进行排序?

标签 mysql

我正在尝试根据匹配的列数对搜索结果进行排序。

变量 :Name:Email:Fullnumbers 在 PHP 中前后得到 %。

当我省略 ORDER BY 子句时,查询工作正常。当我从 ORDER BY 子句中删除 Fullnumbers 时,它也有效。 名称和电子邮件部分匹配的行将以正确的顺序返回。 但是,当包含 Fullnumbers 时,不会返回任何行。

这是为什么?我该如何解决这个问题?

SELECT SQL_CALC_FOUND_ROWS DISTINCT(User.UserId), Name, Email,
GROUP_CONCAT(CONCAT(Countrycode, Number)) AS Fullnumbers
FROM User LEFT JOIN UserPhonenumber ON User.UserId = UserPhonenumber.UserId
GROUP BY UserId HAVING Name LIKE :Name OR Email LIKE :Email OR Fullnumbers LIKE :Fullnumbers
ORDER BY ((Name LIKE :Name) + (Email LIKE :Email) + (Fullnumbers LIKE :Fullnumbers)) DESC

最佳答案

那么您想使用 ORDER BY CASE 子句。这是一个例子:

ORDER BY CASE
  WHEN Name LIKE :Name THEN 1
  WHEN Email LIKE :Email THEN 2
  WHEN Fullnumbers LIKE :Fullnumbers THEN 3
  ELSE 4 END;

编辑

使用多个 IF 子句,您可以按相关性对结果集进行排序。

ORDER BY
  IF (Name LIKE :Name,1,0) + 
  IF (Email LIKE :Email,1,0) +
  IF (Fullnumbers LIKE :Fullnumbers,1,0) 
DESC;

引用:MySQL order by relevance

编辑2 解决方案:

SELECT * FROM (
  SELECT SQL_CALC_FOUND_ROWS DISTINCT(User.UserId), Name, Email,
  GROUP_CONCAT(CONCAT(Countrycode, Number)) AS Fullnumbers
  FROM User LEFT JOIN UserPhonenumber ON User.UserId = UserPhonenumber.UserId
  GROUP BY UserId HAVING Name LIKE :Name OR Email LIKE :Email OR Fullnumbers LIKE :Fullnumbers) AS t1
ORDER BY
  IF (Name LIKE :Name,1,0) + IF (Email LIKE :Email,1,0) + IF (Fullnumbers LIKE :Fullnumbers,1,0) DESC;

关于mysql - 使用 GROUP_CONCAT 时如何按匹配的字段数对行进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36249246/

相关文章:

mysql - 有没有什么方法可以列出或证明 MySQL 中的检查约束(就像主键和外键一样)?

MySQL 通过一个字段连接多条记录

MySQL - LEFT JOIN 和 NOT IN

mysql - SQL 查询从使用另一个表的表中选择计数和求和

java - 从数据库设置图像

mysql - 使用 INNER JOIN 和 WHERE 的 SQL 查询

mysql - 数据库中的列排序会影响性能吗?

mysql - 如何在Laravel 5中处理BIT数据类型?

使用变量时 PHP MySQL 请求不起作用

PHP SQL Select 语句 VS 保存到文件服务器加载