Получение MySQL Result-Set + LIMIT на основе расчета - PullRequest
0 голосов
/ 31 августа 2018

Хорошо, поэтому я хочу вернуть данные из таблицы, основываясь на том, насколько они идентичны. Так что, если все столбцы точно совпадают, то это 100%, если 9/10 соответствует 90% и т. Д.

Я мог бы просто сделать

SELECT * FROM table

, а затем используйте цикл for в php или что-то подобное, размещая каждую строку с более высоким индексом, если ее значение больше%, но проблема в том, что если нет 10 записей, а 100 000! это заставило бы загрузку скрипта длиться вечно ...

Таким образом, LIMIT не будет работать с 100 000 записей без какого-либо определения% соответствия в запросе SQL, который я не могу выяснить Будет ли задействовать функции COUNT, SUM ...?

Пример таблицы: (Пользователи любимых вещей)

+---------------------------------------------------------------<br>
| id | color | food | cocktail | city | sport | <br>
+----------------------------------------------------------------<br>
| 1 | blue | pasta | cosmo | paris | football | <br>
| 2 | blue | burgers | lit | nyc | football | <br>
| 3 | green | hot dogs | negroni | nyc | football | <br>
| 4 | orange | sushi | manhattan | madrid | football | <br>
| 5 | purple | burgers | cosmo | paris | baseball | <br>
| 6 | red | sushi | lit | miami | basketball | <br>
| 7 | blue | sushi | cosmo | paris | football | <br>
| 8 | green | pasta | cosmo | madrid | baseball | <br>
| 9 | yellow | pasta | lit | paris | football |<br>
|10 | green | sushi | appletini | nyc | baseball |<br>
+------------------------------------------------------------------ <br>

Эта маленькая таблица не будет иметь никакого значения, выбирая все записи и сортируя с помощью PHP, но представьте, что это было БОЛЬШЕ
Скажем, вы сравниваете WHERE id = 1 и хотите, чтобы набор результатов был с LIMIT 5, где возвращаемые 5 имеют самое близкое совпадение (из 5) с первой строкой?
Так что пользователь с синим | макароны | космо | Париж | футбол | будет иметь 100% совпадение
и если это невозможно с SQL, то что мне делать с большим количеством записей, потому что PHP для циклической сортировки записей будет очень дорогой по производительности ...

* Извините, если этот вопрос был сбивающим с толку или плохо написан, я изо всех сил пытался объяснить!

1 Ответ

0 голосов
/ 31 августа 2018

В MySQL вы можете сделать:

select ft.*
from favorite_things ft cross join
     favorite_things ft1
where ft1.id = 1 and ft1.id <> ft.id
order by ( (ft.color = ft1.color) +
           (ft.food = ft1.food) +
           (ft.cocktail = ft1.cocktail) +
           (ft.city = ft1.city) +
           (ft.sport = ft1.sport)
         ) desc
limit 5;

MySQL рассматривает логическое значение как число в числовом контексте, с 1 для "true" и 0 для "false". Итак, при суммировании логических значений учитываются совпадения.

Остальное просто order by и limit.

В других базах данных вы можете сделать то же самое, используя выражения case.

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