У меня есть такой набор данных:
Логин пользователя | Код товара | счет |
---|---|---|
А | 1 | 4 |
А | 2 | 4 |
А | 3 | 5 |
Б | 1 | 4 |
Б | 2 | 4 |
Б | 3 | 5 |
Я хочу иметь такой вывод:
идентификатор пользователя1 | идентификатор пользователя2 | match_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 |
Пожалуйста, попробуйте это:
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;
Весь скрипт смотрите: БД рабочий пример
Вы можете попробовать со следующим запросом:
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, которая позволяет выполнять агрегирование по строковому полю. Вы можете установить параметр «разделитель», чтобы решить, какую строку вы хотите использовать для объединения ваших значений.
Попробуйте полный запрос здесь.
спасибо! работает очень хорошо! также спасибо за форматирование моего сообщения :)
это идеально, но также выбираются пары, которые имеют менее 3-х общих продуктов