MySQL заказ по головной боли - PullRequest
1 голос
/ 14 апреля 2020

У меня есть таблица с именами и фамилиями, и я хотел бы проверить, нет ли переставленных данных.

Таблица

+----+-----------+----------+
| Id | firstname | lastname |
+----+-----------+----------+
|  0 |  Raphael  |  Thomas  |
|  1 |   Robert  | Vincent  |
|  2 | Philippe  |  Michel  |
|  3 |  Vincent  |  Robert  |
|  4 |   Thomas  | Raphael  |
+----+-----------+----------+

Я бы хотел нравится группировать результат и затем выделять любые пары

Ожидаемый результат

+----+-----------+----------+
| Id | firstname | lastname |
+----+-----------+----------+
|  0 |  Raphael  |  Thomas  |
|  4 |   Thomas  | Raphael  |
|  1 |   Robert  | Vincent  |
|  3 |  Vincent  |  Robert  |
+----+-----------+----------+

Это работает, когда число символов fisrtname + lastname отличается, но не когда сумма та же

SELECT t1.id, t1.lastname, t1.firstname
FROM table t1 JOIN table t2 ON t2.lastname = t1.firstname AND t2.firstname = t1.lastname
ORDER BY length(t1.lastname)+length(t1.firstname)

Я также пытался преобразовать в HEX и суммировать результаты HEX, но получил ошибку «DOUBLE value is out of range».

Как я могу отсортировать это из

Ответы [ 3 ]

1 голос
/ 14 апреля 2020

Вы можете использовать трюк LEAST / GREATEST здесь:

SELECT
    Id,
    firstname,
    lastname
FROM yourTable t1
WHERE EXISTS (SELECT 1 FROM yourTable t2 WHERE t2.Id <> t1.Id AND 
              t2.lastname = t1.firstname AND t2.firstname = t1.lastname)
ORDER BY
    LEAST(firstname, lastname),
    GREATEST(firstname, lastname);

screen capture of demo link below

Демо

0 голосов
/ 14 апреля 2020

Использование INNER JOIN прекрасно подходит для этого:

SELECT t1.id, t1.firstname, t1.lastname FROM table t1
INNER JOIN table t2 ON t2.lastname = t1.firstname AND t2.firstname = t1.lastname
GROUP BY t1.firstname, t1.lastname
ORDER BY t1.firstname, t1.lastname

Ожидаемый результат:

+----+-----------+----------+
| Id | firstname | lastname |
+----+-----------+----------+
|  0 |  Raphael  |  Thomas  |
|  1 |   Robert  | Vincent  |
|  4 |   Thomas  | Raphael  |
|  3 |  Vincent  |  Robert  |
+----+-----------+----------+

Внутренние объединения показывают только результаты которые появляются по обе стороны от объединения, а не от сирот.

GROUP BY полезен, если вы хотите сохранить уникальные комбинации значений, полностью необязательно , если вы не разрешать нереверсные дубликаты (поэтому, если нельзя вставить два «Томас, Рафаэль» в таком порядке, тогда нет необходимости)

* INNER JOIN MySQL используется для возврата всех строк из нескольких таблиц, где выполняется условие соединения. Это наиболее распространенный тип объединения.

Предложение MYSQL GROUP BY используется для сбора данных из нескольких записей и группировки результатов по одному или нескольким столбцам. Обычно используется в операторе SELECT.

Сохраняет его коротким и приятным:)

0 голосов
/ 14 апреля 2020

Можно ли попытаться объединить результат, выполнив поиск lastName в первом запросе, соответствующем столбцу firstName, и поиск firstName во втором запросе, соответствующем столбцу lastName?

select id,firstname,lastname from table WHERE firstname IN(select lastName from table)
UNION
select id,firstname,lastname from table WHERE lastname IN(select firstname from table)
...