Mysql 按联接表中匹配实例的n_数量排序

Mysql 按联接表中匹配实例的n_数量排序,mysql,sql,Mysql,Sql,我正在编写一个程序来查询我的数据库。我必须提供一对多表tbl\u用户服务和tbl\u用户竞争 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 : "

我正在编写一个程序来查询我的数据库。我必须提供一对多表tbl\u用户服务tbl\u用户竞争

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'
给定两个数组,它们被格式化成字符串,可以放入
子句中的
“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_竞赛中给定用户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

您能否发布一些示例数据以及您的预期结果是什么?您需要一个
计数
和一个
分组依据
来实现这一点。您使用的是什么rdbms?表之间的连接是什么(我假设是userId列)?参见postThank you very Zohar的编辑,很容易理解,并根据需要解决了我的问题。今天的MWP很乐意帮忙:-)