MySQL: сопоставьте набор значений с значениями столбцов с другим порядком

72
10

У меня есть таблица с датой и некоторые поля с целыми числами:

SELECT * FROM numbers LIMIT 10;

+----+------------+----+----+----+----+----+----+----+
| id | gen_date | n1 | n2 | n3 | n4 | n5 | n6 | n7 |
+----+------------+----+----+----+----+----+----+----+
| 1 | 1990-12-27 | 22 | 43 | 18 | 23 | 16 | 7 | 0 |
| 2 | 1990-12-19 | 39 | 11 | 38 | 23 | 24 | 36 | 0 |
| 3 | 1990-12-12 | 44 | 12 | 10 | 48 | 14 | 4 | 0 |
| 4 | 1990-12-05 | 2 | 4 | 5 | 46 | 48 | 49 | 0 |
| 5 | 1991-12-25 | 10 | 2 | 44 | 49 | 29 | 34 | 0 |
| 6 | 1991-12-18 | 6 | 19 | 42 | 4 | 12 | 28 | 0 |
| 7 | 1991-12-11 | 1 | 12 | 42 | 7 | 31 | 25 | 0 |
| 8 | 1991-12-04 | 18 | 47 | 31 | 30 | 10 | 35 | 0 |
| 9 | 1991-11-27 | 38 | 33 | 39 | 47 | 13 | 11 | 0 |
| 10 | 1991-11-20 | 23 | 7 | 22 | 18 | 43 | 16 | 0 |
+----+------------+----+----+----+----+----+----+----+

Все номера строк уникальны nx <> ny.

Я хочу сопоставить набор из 6 чисел с столбцами от n1 to n6 независимо от порядка значений.

Например, в строке с ID=1 есть 22, 43, 18, 23, 16, 7 а строка с ID=10 имеет те же номера 23, 7, 22, 18, 43, 16. Я написал запрос для каждой строки, содержащей все числа в наборе столбцов каждой строки. Если мне нужно искать числа 7, 16, 18, 22, 23, 43 тогда результат возвращает оба строки ID=1 и ID=10.

Я получил его работу, используя функцию FIELD для поиска каждого номера через все значения полей, например:

SELECT * FROM numbers
WHERE
FIELD(7, n1, n2, n3, n4, n5, n6) > 0 AND
FIELD(16, n1, n2, n3, n4, n5, n6) > 0 AND
FIELD(18, n1, n2, n3, n4, n5, n6) > 0 AND
FIELD(22, n1, n2, n3, n4, n5, n6) > 0 AND
FIELD(23, n1, n2, n3, n4, n5, n6) > 0 AND
FIELD(43, n1, n2, n3, n4, n5, n6) > 0;

+----+------------+----+----+----+----+----+----+----+
| id | gen_date | n1 | n2 | n3 | n4 | n5 | n6 | n7 |
+----+------------+----+----+----+----+----+----+----+
| 1 | 1990-12-27 | 22 | 43 | 18 | 23 | 16 | 7 | 0 |
| 10 | 1991-11-20 | 23 | 7 | 22 | 18 | 43 | 16 | 0 |
+----+------------+----+----+----+----+----+----+----+

Это работает, но у меня есть некоторые сомнения относительно того, как это работает, и если этот подход эффективен при использовании против десятых тысяч строк.

Есть ли другой лучший (или, может быть, более простой) способ сделать что-то подобное?

спросил(а) 2017-08-27T22:46:00+03:00 3 года, 3 месяца назад
1
Решение
74

Ваш запрос может быть упрощен для:

SELECT * 
FROM numbers
WHERE
7 IN (n1, n2, n3, n4, n5, n6) AND
16 IN (n1, n2, n3, n4, n5, n6) AND
18 IN (n1, n2, n3, n4, n5, n6) AND
22 IN (n1, n2, n3, n4, n5, n6) AND
23 IN (n1, n2, n3, n4, n5, n6) AND
43 IN (n1, n2, n3, n4, n5, n6) ;

ответил(а) 2017-08-27T23:29:00+03:00 3 года, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема