Мне нужно найти совпадение для пользователя.MySQL Query - многие для многих
Каждый пользователь имеет мультипликатор «Категория» (как бухгалтерский учет, банковское дело, финансы и т.д.) и множественным «привилегированной категории работы» (найти соответствующий профиль в тех указанной категории)
Что такое эффективная способ найти совпадение с помощью MySQL Query.
Структура MyProfile таблице:
User_Id | Work_Id
1 | 5
1 | 7
1 | 8
2 | 7
2 | 9
Структура PreferedWork стол
User_Id | Work_Id
1 | 7
1 | 9
2 | 1
2 | 8
Я должен проверить против 100000 профилей и возвращать только 10 профилей.
EDIT: Мой Оригинальный запрос (без присоединиться):
$getMatchesQry = "
select ed.Entity_Id as entId,ed.Status as status,ed.First_Name,ed.Profile_Pic_Url,ed.Sex,ed.Current_Lat,ed.Current_Long,ed.community,ed.ethnicity,ed.Fb_Id,ent.Last_Active_Dt_Time,
YEAR(NOW()) - YEAR(ed.dob) - (RIGHT(NOW(), 5) < RIGHT(ed.DOB, 5)) as age, pr.Orientation
from entity_details ed,entity ent, preferences pr
where
(3959 * acos(cos(radians('" . $prefRow['Current_Lat'] . "')) * cos(radians(ed.Current_Lat)) * cos(radians(ed.Current_Long) - radians('" . $prefRow['Current_Long'] . "')) + sin(radians('" . $prefRow['Current_Lat'] . "')) * sin(radians(ed.Current_Lat)))) <= " . $prefRow['Preference_radius'] . "
and
(" . $pref_sex_str . ")
and
(" . $prefComWord . ") and (" . $prefRelWord . ")
and
pr.Orientation = '" . $prefRow['Orientation'] . "'
and
'" . $prefRow['min_height'] . "' <= ed.height
and
ed.height <= '" . $prefRow['max_height'] . "'
and
ed.Entity_Id = ent.Entity_Id and
ed.Entity_Id = pr.Entity_Id and
ent.status = 1 and ed.Fb_Id != '" . $prefRow['Fb_Id'] . "' and
ed.Entity_Id NOT IN (select Entity2_Id from likes where Entity1_Id = '" . $entityId . "' and (Like_Flag = '1' OR Like_Flag = '2' OR Like_Flag = '3' OR Like_Flag = '4'))
having
age BETWEEN '" . $prefRow['Preference_lower_age'] . "' AND '" . $prefRow['Preference_upper_age'] . "' LIMIT 10";
, когда я добавить присоединиться,
$getMatchesQry = "
select ed.Entity_Id as entId,ed.Status as status,ed.First_Name,ed.Profile_Pic_Url,ed.Sex,ed.Current_Lat,ed.Current_Long,ed.community,ed.ethnicity,ed.Fb_Id,ent.Last_Active_Dt_Time,
YEAR(NOW()) - YEAR(ed.dob) - (RIGHT(NOW(), 5) < RIGHT(ed.DOB, 5)) as age, pr.Orientation
from entity_details ed,entity ent, preferences pr, **pref_occupation ul1, users_occ ul2**
where
(3959 * acos(cos(radians('" . $prefRow['Current_Lat'] . "')) * cos(radians(ed.Current_Lat)) * cos(radians(ed.Current_Long) - radians('" . $prefRow['Current_Long'] . "')) + sin(radians('" . $prefRow['Current_Lat'] . "')) * sin(radians(ed.Current_Lat)))) <= " . $prefRow['Preference_radius'] . "
and
(" . $pref_sex_str . ")
and
(" . $prefComWord . ") and (" . $prefRelWord . ")
and
pr.Orientation = '" . $prefRow['Orientation'] . "'
and
'" . $prefRow['min_height'] . "' <= ed.height
and
ed.height <= '" . $prefRow['max_height'] . "'
and
**(ul1.Occupation_Id = ul2.Work_Id AND ul1.Entity_Id != ul2.Entity_Id AND ul2.Entity_Id = ed.Entity_Id)**
and
ed.Entity_Id = ent.Entity_Id and
ed.Entity_Id = pr.Entity_Id and
ent.status = 1 and ed.Fb_Id != '" . $prefRow['Fb_Id'] . "' and
ed.Entity_Id NOT IN (select Entity2_Id from likes where Entity1_Id = '" . $entityId . "' and (Like_Flag = '1' OR Like_Flag = '2' OR Like_Flag = '3' OR Like_Flag = '4'))
having
age BETWEEN '" . $prefRow['Preference_lower_age'] . "' AND '" . $prefRow['Preference_upper_age'] . "' LIMIT 10";
Когда я добавляю JOIN (упоминается в жирным), я получить только частичный результат и НЕ комбинировать результат из исходного запроса.
Я думаю, я перепутал И или другой важный оператор цепочки где-то.
Редактировать 2:: Получение правильных значений сейчас. В любом случае, чтобы его оптимизировать?
$getMatchesQry = "select DISTINCT ed.Entity_Id as entId,ed.Status as status,ed.First_Name,ed.Profile_Pic_Url,ed.Sex,ed.Current_Lat,ed.Current_Long,ed.community,ed.ethnicity,ed.Fb_Id,ent.Last_Active_Dt_Time,
YEAR(NOW()) - YEAR(ed.dob) - (RIGHT(NOW(), 5) < RIGHT(ed.DOB, 5)) as age, pr.Orientation
from entity_details ed, entity ent, preferences pr, pref_occupation ul1, users_occ ul2,
where
(3959 * acos(cos(radians('" . $prefRow['Current_Lat'] . "')) * cos(radians(ed.Current_Lat)) * cos(radians(ed.Current_Long) - radians('" . $prefRow['Current_Long'] . "')) + sin(radians('" . $prefRow['Current_Lat'] . "')) * sin(radians(ed.Current_Lat)))) <= " . $prefRow['Preference_radius'] . "
and
(" . $pref_sex_str . ")
and
(" . $prefComWord . ") and (" . $prefRelWord . ")
and
pr.Orientation = '" . $prefRow['Orientation'] . "'
and
'" . $prefRow['min_height'] . "' <= ed.height
and
ed.height <= '" . $prefRow['max_height'] . "'
and
((ul1.Occupation_Id = ul2.Work_Id AND ul1.Entity_Id != ul2.Entity_Id AND ul2.Entity_Id = ed.Entity_Id))
and
ed.Entity_Id = ent.Entity_Id and
ed.Entity_Id = pr.Entity_Id and
ent.status = 1 and ed.Fb_Id != '" . $prefRow['Fb_Id'] . "' and
ed.Entity_Id NOT IN (select Entity2_Id from likes where Entity1_Id = '" . $entityId . "' and (Like_Flag = '1' OR Like_Flag = '2' OR Like_Flag = '3' OR Like_Flag = '4'))
having
age BETWEEN '" . $prefRow['Preference_lower_age'] . "' AND '" . $prefRow['Preference_upper_age'] . "' LIMIT 10";
Передайте то, что вы пробовали. Покажите нам, что вы ожидаете от результата. –
Что вы сделали до сих пор? Какие вопросы вы пробовали? Каковы были эти результаты? По существу, покажите часть выполненной вами работы, и мы будем работать над улучшением, где вы находитесь, но сначала вам нужно начать. –
Ваш вопрос недостаточен. «Каков эффективный способ найти совпадение с помощью MySQL Query». Что именно нужно искать? –