Как выбрать пару идентификаторов пользователей, у которых есть как минимум 3 проверенных идентификатора продукта с оценкой продукта не менее 4/5 в sql

У меня есть такой набор данных:

Логин пользователяКод товарасчет
А14
А24
А35
Б14
Б24
Б35

Я хочу иметь такой вывод:

идентификатор пользователя1идентификатор пользователя2match_product
АБ1 2 3

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

CREATE TABLE score_greater_than_3 AS
SELECT userid, productid, score
FROM reviews
WHERE score >= 4;

SELECT s1.userid as userid1, s2.userid as userid2
FROM score_greater_than_3 s1 
INNER JOIN score_greater_than_3 s2 ON s1.productid=s2.productid AND s1.userid<s2.userid
GROUP BY s1.userid, s2.userid
HAVING count(*)>=3;

Как я могу получить соответствующие продукты? я тоже согласен с таким выводом, если это проще

пользователь1пользователь2соответствующий продукт
аб1
аб2
аб3
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
29
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Пожалуйста, попробуйте это:

select s1.userid as userid1, s2.userid as userid2, 
GROUP_CONCAT(s1.productid) 
from score_greater_than_3 s1 inner join score_greater_than_3 s2 on s1.productid=s2.productid and s1.userid<s2.userid
group by s1.userid, s2.userid;

Весь скрипт смотрите: БД рабочий пример

это идеально, но также выбираются пары, которые имеют менее 3-х общих продуктов

Claudio V 17.05.2022 02:46
Ответ принят как подходящий

Вы можете попробовать со следующим запросом:

WITH cte AS (
    SELECT r.userid,
           r.productid
    FROM reviews r
    WHERE r.score > 3
)
SELECT r1.userid,
       r2.userid,
       GROUP_CONCAT(r1.productid SEPARATOR ' ')       
FROM       cte r1
INNER JOIN cte r2
        ON r1.productid = r2.productid
       AND r1.userid < r2.userid
GROUP BY r1.userid,
         r2.userid
HAVING COUNT(*) >= 3

Он использует Общее табличное выражение, который позволяет вам размещать вашу таблицу во временном пространстве, которое длится до конца запроса. Ваш следующий шаг с использованием самообъединения правильный, хотя в нем отсутствует функция агрегирования GROUP_CONCAT, которая позволяет выполнять агрегирование по строковому полю. Вы можете установить параметр «разделитель», чтобы решить, какую строку вы хотите использовать для объединения ваших значений.

Попробуйте полный запрос здесь.

спасибо! работает очень хорошо! также спасибо за форматирование моего сообщения :)

Claudio V 17.05.2022 02:49

Другие вопросы по теме