@IceJOKER
Web/Android developer

Как вывести все поля с максимальным совпадением значений полей?

Есть таблица

id user_id data
1 - 1 - Заяц
2 - 1 - Волк
3 - 1 - Медведь

4 - 2 - Заяц
5 - 2 - Лиса

6 - 3 - Заяц

7 - 4 - Медведь
8 - 4 - Волк
9 - 4 - Заяц
10 - 4 - Орангутанг

11 - 5 - Троль
12 - 5 - Лиса

Нужно вывести в таком порядке (порядок такой же как и у меня) -
для пользователя - выводим данные пользователя(-ей)
1 - 4 (т.к. все совпадают), потом 2 и 3 (т.к. совпадает одно поле)
2 - 1, 3, 4, 5 (одно поле совпадает)
3 - выводим всех кроме 5-го пользователя
4 - 1, 2, 3
5 - 2

Надеюсь, правильно объяснил, словами если объяснить - нужно найти для пользователя пересечения данных с остальными пользователями и отсортировать по убыванию в зависимости от того, сколько данных совпало
  • Вопрос задан
  • 3175 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `t`.`user_id` AS `user1`, `s`.`user_id` AS `user2`, count(`s`.`user_id`) AS `num`
  FROM `table` AS `t`
    JOIN `table` AS `s` ON (`t`.`data` = `s`.`data` AND `t`.`user_id` != `s`.`user_id`)
  GROUP BY `user1`, `user2`
  ORDER BY `user1`, `num` DESC, `user2`
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
svd71
@svd71
select u1.*, u2.* 
from users u1, users u2
where u1.data = u2.data and u1.id <> u2.id
order by u1.id
Ответ написан
Комментировать
@IceJOKER Автор вопроса
Web/Android developer
Переделал запрос, чтоб он выводил еще и имена пользователей, а так же совпавшиеся данные, а как вывести в этом же запросе все данные(data), которые не совпали as NOEQ

SELECT CONCAT(`t`.`user_id`, ' | ', `u1`.`name`) AS `user1`, CONCAT(`s`.`user_id`, ' | ', `u2`.`name`) AS `user2`, count(`s`.`user_id`) AS `num`, 
GROUP_CONCAT(`t`.`data`) as EQ
  FROM `user_data` AS `t`
    JOIN `user_data` AS `s` ON (`t`.`data` = `s`.`data` AND `t`.`user_id` != `s`.`user_id`)
    JOIN `users` AS `u1` ON(`u1`.`id` = `t`.`user_id`)
    JOIN `users` AS `u2` ON(`u2`.`id` = `s`.`user_id`)
where `t`.`user_id` = 7
  GROUP BY `user1`, `user2`
  ORDER BY `user1`, `num` DESC, `user2`


Этот код все выводит нормально, осталось в этом же коде вывести и данные которые не совпали, отдельно можно было бы сделать так:

SELECT CONCAT(`t`.`user_id`, ' | ', `u1`.`name`) AS `user1`, CONCAT(`s`.`user_id`, ' | ', `u2`.`name`) AS `user2`, count(`s`.`user_id`) AS `num`, 
GROUP_CONCAT(`s`.`data`) as NEEQ
  FROM `user_data` AS `t`
    JOIN `user_data` AS `s` ON (`t`.`data` != `s`.`data` AND `t`.`user_id` != `s`.`user_id`)
    JOIN `users` AS `u1` ON(`u1`.`id` = `t`.`user_id`)
    JOIN `users` AS `u2` ON(`u2`.`id` = `s`.`user_id`)
where `t`.`user_id` = 7
  GROUP BY `user1`, `user2`
  ORDER BY `user1`, `num` DESC, `user2`
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы