按位置排序mysql查询结果

时间:2018-12-17 17:40:25

标签: mysql

我有一个搜索栏,可通过其名称或用户名搜索其他用户,这很容易,但是我想做的是,以防万一一个用户使用与您相同的名字搜索我想先显示最接近您的用户,以便首先显示与您在同一个城市,然后在同一国家,然后在世界其他地方的,具有该名称的用户,我能够通过多次查询可以达到所需的结果,但是一次查询是否可以实现?

注意:我用于搜索的用户表包含UsernameFNameLNameCountryCodeCityID

这些是我现在正在使用的查询:

Select user.USERNAME, AVG(userrating.RATING) as Avg_Rating
from user LEFT JOIN userrating on user.USERNAME = userrating.USERNAME
WHERE CONCAT (user.FNAME, " ", user.LNAME) like '%Searched Name%' and user.CITYID = User's_City_ID
GROUP by user.USERNAME
ORDER by Avg_Rating

然后,我使用相同的查询,但查询的是用户所在的国家/地区,但不包括先前使用的城市:

Select user.USERNAME, AVG(userrating.RATING) as Avg_Rating
    from user LEFT JOIN userrating on user.USERNAME = userrating.USERNAME
    WHERE CONCAT (user.FNAME, " ", user.LNAME) like '%Searched Name%' and user.CountryCode = User's_Country_Code and not user.CITYID = User's_City_ID
    GROUP by user.USERNAME
    ORDER by Avg_Rating

,然后相同,但不包括我在上一个中使用的整个国家。查询:

Select user.USERNAME, AVG(userrating.RATING) as Avg_Rating
    from user LEFT JOIN userrating on user.USERNAME = userrating.USERNAME
    WHERE CONCAT (user.FNAME, " ", user.LNAME) like '%Searched Name%' and not user.CountryCode = User's_Country_Code
    GROUP by user.USERNAME
    ORDER by Avg_Rating

然后将三个查询的结果合并在一起。

2 个答案:

答案 0 :(得分:0)

仅用一个查询很难做到这一点,但是您可以执行以下操作:

SELECT * FROM users WHERE username LIKE '%searchkey%' OR fname LIKE '%searchkey%' OR lname LIKE '%searchkey%' OR countryid LIKE '%searchkey%' OR cityid LIKE '%searchkey%'

Here,您可以详细了解LIKE运算符。

答案 1 :(得分:0)

从当前查询(在下面的SQL中称为“ other”)开始,您要在与当前用户相对应的记录(称为“ me”)上进行JOIN,然后使用特殊的ORDER BY子句显示最接近的首先使用CASE构造匹配记录。

这假定«用户名»可用于唯一标识当前用户。

    SELECT 
        other.username
    FROM userrating other
    INNER JOIN userrating me on me.username = 'bar'
    WHERE 
       CONCAT (other.FNAME, " ", other.LNAME) like '%Searched Name%'
    ORDER BY
    CASE
        WHEN other.cityid = me.cityid THEN 0
        WHEN other.countryid = me.countryid THEN 1
        ELSE 2
    END,
    other.username

您需要用当前用户名替换'bar'。