我正在编写一个程序来查询我的数据库。我必须对一个表 tbl_user_service 和 tbl_user_competens
将两个数组的奶酪格式化为可以放入 IN 子句->'word','word_2'...等的字符串。
我将根据具有的匹配能力的数量来查询所有具有匹配服务和顺序的用户。
到目前为止,我的查询是这样的
$sql = "SELECT DISTINCT tbl_users.* FROM tbl_users
INNER JOIN tbl_user_service
ON tbl_users.region = '$region'
AND tbl_user_service.fld_service IN ($services_in)
INNER JOIN tbl_user_competens
ORDER BY FIELD(tbl_user_competens, $competens_in)
";
返回给我的结果是正确的,我要寻找的是如何在tbl_user_competens中为给定的user_id找到基于匹配实例对它们进行排序的方法
测试驱动器和所需结果
Query_Data :
Region : "Some_State"
Services : 'Webdevelopment', 'Some Service'
Competens : 'React JS', 'Native JS'
tbl_users:
fld_user_id : 1 Region : "Some_State"
fld_user_id : 2 Region : "Some_State"
fld_user_id : 3 Region : "Some_State"
tbl_user_services :
fld_user_id : 1 service : 'Webdevelopment'
fld_user_id : 2 service : 'Webdevelopment'
fld_user_id : 3 service : 'Webdevelopment'
tbl_user_competens :
fld_user_id : 1 competens : 'React JS'
fld_user_id : 1 competens : 'Native JS'
fld_user_id : 2 competens :'React JS'
结果应为
用户1,因为有2个匹配项 用户1个匹配竞赛中的2个 用户3个,因为0个匹配项
答案 0 :(得分:1)
与其联接组成表,不联接到派生表,而是为每个用户ID选择与组件列表匹配的组件数量。
另外,不要使用distinct
和联接服务表,而要使用exists
和相关的子查询。
这将使您能够根据select子句中未包含的列对结果进行排序。
SELECT u.fld_user_id, Region
FROM tbl_users As u
INNER JOIN
(
SELECT fld_user_id, COUNT(*) As number_of_component
FROM tbl_user_competens
WHERE components IN($competens_in)
GROUP BY fld_user_id
) As uc
ON u.fld_user_id = uc.fld_user_id
WHERE EXISTS
(
SELECT 1
FROM tbl_user_services As s
WHERE s.fld_user_id = u.fld_user_id
AND service IN($services_in)
)
ORDER BY number_of_component