我正在编写一个程序来查询我的数据库。我必须 one_to_n 表 tbl_user_service 和 tbl_user_competens
给定两个数组,cheese 被格式化为可以放入 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 匹配有能力 用户 2 因为 1 匹配有资格 用户 3 自 0 匹配胜任
最佳答案
不要加入组件表,而是加入从中派生的表,为每个用户 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
关于mysql - 按连接表中匹配实例的 n_ammounts 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55702894/