Mysql

MySQL - 按多列上最接近的值排序

  • January 24, 2016

我有一張遊戲大廳的桌子。在這個大廳中,使用者可以了解他們的聯繫和他們的等級。在我的 SQL 語句中,我得到了大廳中所有使用者級別和連接在 +5/-5 之間的使用者。但是我想訂購這個,以便使用者的級別是最重要的,然後它會查看連接。因此,如果有兩個相同級別的使用者,它將改為查看連接。也許將來會有更多的列可以用來進一步細化搜尋。我已經看到像這樣的單列選擇,我可以使用abs()但是我不確定這是否也可以?

create table users (
 id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 connection INT(11),
 level INT (11)
);

create table lobby (
 id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 user_id INT(11),
 CONSTRAINT user_id FOREIGN KEY (id)
 REFERENCES users(id)
);

insert into users values (null,5,6);
insert into users values (null,7,10);
insert into users values (null,10,9);
insert into users values (null,10,4);
insert into users values (null,1,8);

insert into lobby values (null,1);
insert into lobby values (null,2);
insert into lobby values (null,3);
insert into lobby values (null,4);
insert into lobby values (null,5);

因此,如果我使用 user_id = 1 作為我的使用者,我將有以下選擇語句:

select lobby.id, lobby.user_id, users.connection, users.level
from lobby INNER JOIN users
ON lobby.user_id = users.id 
where user_id <> 1 and 
users.connection between 0 and 10 and
users.level between 1 and 11
order by abs(connection-5);

此 select 語句返回下表:

| id | user_id | connection | level |
|----|---------|------------|-------|
|  2 |       2 |          7 |    10 |
|  5 |       5 |          1 |     8 |
|  3 |       3 |         10 |     9 |
|  4 |       4 |         10 |     4 |

但是我想要的是以下輸出:

| id | user_id | connection | level |
|----|---------|------------|-------|
|  2 |       2 |          7 |    10 |
|  5 |       5 |          1 |     8 |
|  4 |       4 |         10 |     4 |
|  3 |       3 |         10 |     9 |

謝謝。

編輯:好的,所以我目前正在使用 abs 函式並且它執行良好,但是它正在處理多個欄位,因此我覺得該語句不是很有效。有沒有更好的方法來做到這一點?

只需添加另一列, order by abs(connection-5), abs(level-4)是有效的語法:

select lobby.id, lobby.user_id,
  users.connection, users.level
from lobby INNER JOIN users
ON lobby.user_id = users.id
where lobby.user_id <> 1
 and users.connection between 0 and 10 
 and users.level between 1 and 11
order by abs(connection-5), abs(level-4);

嘗試這樣的事情:

SELECT l.id
     ,l.user_id # current user ID
     ,others.id # other user's ID
     ,others.connection
     ,others.level
FROM lobby l
INNER JOIN users AS myuser
 ON l.user_id = myuser.id
INNER JOIN users AS others
 # Remove l.user_id = others.id
 ON myuser.id <> others.id
 AND ABS(myuser.connection - others.connection) <= 5
 AND ABS(myuser.level - others.level) <= 5
WHERE myuser.id = 1
order by ABS(myuser.connection - others.connection),
       ABS(myuser.level - others.level);

引用自:https://dba.stackexchange.com/questions/127090