Mysql
MySQL - 按多列上最接近的值排序
我有一張遊戲大廳的桌子。在這個大廳中,使用者可以了解他們的聯繫和他們的等級。在我的 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);