Как ВЫБРАТЬ DISTINCT записи на основе значений строк с самосоединением - PullRequest
0 голосов
/ 06 мая 2020

У меня есть одна таблица, содержащая местоположение пользователей, и мне нужно рассчитать расстояние между каждым пользователем. В качестве результирующей таблицы у меня должна быть таблица длиной x * (x - 1) / 2, где x - длина таблицы пользователей. Но я получаю гораздо большую таблицу, потому что, когда предложение DISTINCT не проверяет значения, отображаемые в другом порядке. В качестве упрощения, скажем, у меня есть эта таблица (в моей реальной таблице я использую CHAR (10) в качестве первичного ключа):

CREATE TABLE Users (
  id INT PRIMARY KEY,
  position INT
)

и для расчета расстояния между двумя пользователями мне нужно только вычтите их position значение. Таким образом, запрос должен быть:

SELECT DISTINCT U1.id, U2.id, ABS(U1.position - U2.position) AS distance
FROM Users AS U1, Users AS U2
WHERE U1.position <> U2.position

, но в результате я получаю повторяющиеся значения, например:

+-------+-------+----------+
| U1.id | U2.id | distance |
+-------+-------+----------+
|   9   |   2   |    7     |
+-------+-------+----------+
|   2   |   9   |    7     |
+-------+-------+----------+

, тогда как вместо этого я должен получить только:

+-------+-------+----------+
| U1.id | U2.id | distance |
+-------+-------+----------+
|   9   |   2   |    7     |
+-------+-------+----------+

1 Ответ

0 голосов
/ 06 мая 2020

Я думаю, вы хотите:

SELECT U1.id, U2.id, ABS(U1.position - U2.position) AS distance
FROM Users U1 JOIN
     Users U2
     ON u1.id > u2.id;

SELECT DISTINCT не нужно, если у вас нет дубликатов в таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...