Найти ближайшую строку с простой формулой по сравнению с данной строкой в ​​MYSQL?

В математической формуле я хочу вычислить разницу или подобие как, разница равна sqrt(s1 - t1)^2таким образом, квадратный корень разницы между Value1 семенного ряда и Value1 сравнения строки, в квадрате. куда S1 равняется value1 семенного ряда и T1 равняется value1 строки сравнения.

Чтобы рассчитать общее сходство или разницу между начальным рядом и сравнительным рядом:

[sqrt(s1-t1)^2]+[sqrt(s2-t2)^2]+[sqrt(s3-t3)^2]+... = Similarity

Так, например, используя таблицу ниже, ID1 это ряд семян, и Id2 строка сравнения, а затем ID3, затем id4 и так далее будут следующие строки сравнения.

[sqrt(3-1)^2]+[sqrt(4-5)^2]+[sqrt(3-3)^2]+[sqrt(5-5)^2]+[sqrt(0-4)^2]+[sqrt(1-1)^2]
+[sqrt(3-2)^2]+[sqrt(4-4)^2] = 2 + 1 + 0 + 0 + 4 + 0 +1 + 4 = 12

Спускаясь по списку,

ID1 to ID2: 2 + 1 + 0 + 0 + 4 + 0 + 1 + 4 = 12
ID1 to ID3: 1 + 1 + 1 + 4 + 4 + 0 + 2 + 1 = 14
ID1 to ID4: 0 + 0 + 0 + 3 + 1 + 1 + 0 + 1 = 6
ID1 to ID5: 1 + 0 + 0 + 4 + 0 + 4 + 3 + 3 = 15

Таким образом, из этой формулы было определено, что ряд ID4 лучший матч с Роу ID1 потому что у него самый низкий номер.

ID   |  Value1  | Value2  | Value3 | Value4 | Value5 | Value6 | Value7 | Value8 |
----------------------------------------------------------------------------------
1    |    3     |    4    |    3   |    5   |    0   |    1   |   3    |    4   |
2    |    1     |    5    |    3   |    5   |    4   |    1   |   2    |    4   |
3    |    4     |    3    |    2   |    1   |    4   |    1   |   1    |    5   |
4    |    3     |    4    |    3   |    2   |    1   |    2   |   3    |    3   |
5    |    2     |    4    |    3   |    1   |    0   |    5   |   0    |    1   |

Я использую PHP и MySQL, и я хотел бы знать, как мне достичь вышеописанного?

1

Решение

Чтобы найти строки, наиболее близкие к определенной строке, вы можете использовать такой запрос:
в котором каждая строка соединяется с начальной строкой, а результаты упорядочены по вычисленной разнице:

SELECT t2.*, ABS(t1.v1-t2.v1)+ABS(t1.v2-t2.v2)+ABS(t1.v3-t2.v3) AS diff
FROM (SELECT * FROM tbl WHERE id=1) AS t1
JOIN tbl AS t2 ON t1.id <> t2.id
ORDER BY diff;

Если вы хотите найти различия между каждой парой строк, сделайте такой запрос:

SELECT t1.id AS t1_id, t2.id AS t2_id,
ABS(t1.v1-t2.v1)+ABS(t1.v2-t2.v2)+ABS(t1.v3-t2.v3) AS diff
FROM tbl AS t1
INNER JOIN tbl AS t2 ON t1.id <> t2.id
ORDER BY t1.id, diff;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]