我正在尝试根据匹配的列数对搜索结果进行排序。
变量 :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;
编辑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/