Darti problem nie jest jak mi się wydaje banalny, bo jeśli chcesz wybrać osoby o danym hobby lub nawet kilku to nie jest problem.
Jednak gdy chcesz wybrać osoby o takich samych zainteresowaniach to pamiętaj że każdy może mieć inną długość listy hobby więc dla każdej osoby wybierasz takie które mają taką samą, takich osób może być kilka.
Więc wybierasz osobę i jej zainteresowania np.:
user_id|hobby_id
1|1
1|2
1|3
potem szukasz osoby która ma te zainteresowania, ale tu tracę pomysł jak...
albo mam błędne założenia od początku. Ale wynikiem końcowym będzie tablica o dwóch polach user_id gdzie obaj użytkownicy mają te same hobby (przy czym będzie coś w stylu 1|2 i 2|1 z powodu że to jest relacja dwu kierunkowa)
Mam małe doświadczenie w tworzeniu zapytań i jeszcze nie czytałem żadnej porządnej książki o tym :|
Coś wykombinowałem, działa, ale optymalności to pewnie ani ciut, ciut nie ma:
SELECT `nalezy`.`u_id`,`zawiera`.`u_id` FROM (SELECT `max`.`u_id`,`sum`.`t_u` FROM (SELECT `u2`.`u_id`,count(*) AS `x` FROM `ush` AS `u2` GROUP BY `u2`.`u_id`) AS `max`
JOIN (SELECT `ush`.`u_id` AS `f_u`,`u`.`u_id` AS `t_u`, COUNT(`u`.`h_id`) AS `ile` FROM `ush` LEFT JOIN `ush` AS `u` ON `u`.`h_id`=`ush`.`h_id` GROUP BY `ush`.`u_id`,`u`.`u_id`) AS `sum`
ON (`max`.`x`=`sum`.`ile` AND `max`.`u_id`=`sum`.`f_u`)) AS `nalezy`
LEFT JOIN (SELECT `max`.`u_id`,`sum`.`t_u` FROM (SELECT `u2`.`u_id`,count(*) AS `x` FROM `ush` AS `u2` GROUP BY `u2`.`u_id`) AS `max`
JOIN (SELECT `ush`.`u_id` AS `f_u`,`u`.`u_id` AS `t_u`, COUNT(`u`.`h_id`) AS `ile` FROM `ush` LEFT JOIN `ush` AS `u` ON `u`.`h_id`=`ush`.`h_id` GROUP BY `ush`.`u_id`,`u`.`u_id`) AS `sum`
ON (`max`.`x`=`sum`.`ile` AND `max`.`u_id`=`sum`.`f_u`)) AS `zawiera`
ON (`nalezy`.`t_u`=`zawiera`.`u_id` AND `nalezy`.`u_id`=`zawiera`.`t_u`)
WHERE `nalezy`.`u_id`<`zawiera`.`u_id`
proste nieprawdaż?
i i tabelka taka:
CREATE TABLE `ush` (
`u_id` int(11) NOT NULL,
`h_id` int(11) NOT NULL,
PRIMARY KEY (`u_id`,`h_id`)
)
jak macie lepsze pomysły piszcie.
EDIT próba aby trochę połamało zapytanie