Есть ли способ проверить более одного совпадения с минимальным значением из таблицы отношений? - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть 2 реляционные таблицы "users" и "user_categories". (В таблицах категорий пользователей 'user_id' и "category_id" сохраняется)

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

Более ясно, я получаю 2 значения в моем запросе 1. массив идентификаторов категорий для сопоставления.2. Процент для сопоставления.

Так, если category_ids = массив (1,2,3,4,5,6,7,8,9,10);

и процент_значение = '100% ';

Тогда на выходе должны быть все пользователи, которые соответствуют всем 10 идентификаторам категории.

Если процент_значение = '30%';

Тогда выходУ put должны быть все пользователи, которые соответствуют любым 3 идентификаторам категории.

Теперь, если я использую 'whereIn ()', он возвращает пользователей, которые соответствуют минимальному значению 1, что мне не нужно.

Это очень сложно сделать такой запрос.Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Я не знаком с Eloquent, но ниже приведен синтаксис sql для запроса с параметром ": GivenPercentage", который будет связан с вашим процентом.

SELECT user_id 
FROM (
    SELECT user_id, COUNT(user_id) AS user_cats 
    FROM user_categories GROUP BY user_id) user_cat_count
WHERE
    user_cats / (SELECT count(category_id) FROM categories) > :givenPercentage

Вы фактически создаете подзапрос для подсчета количества категорий, в котором находится каждый пользователь. Затем вы сравниваете значения с общими категориями в предложении where и проверяете, превышает ли он определенный процент.

0 голосов
/ 20 декабря 2018

Во-первых, вы должны назвать свою сводную таблицу category_user, чтобы следовать Соглашения о красноречивых именах .

Во-вторых, возьмите пересечение массива полученных идентификаторов категорий и идентификаторов категорий, связанных сПользователь.Затем вычислите процент от общего / общего и сравните его с пороговым значением:

// filter only users with at least "percentage_value" or greater matching category ids.
$users = User::all()->filter(function (User $user) {
    $userCategoryIds = $user->categories->pluck('id')->toArray();
    $ids = array_intersect(request()-get('category_ids'), $userCategoryIds);
    return (count($ids) / count(request()->get('category_ids'))) >= request()->get('percentage_value');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...