0

我有 3 张桌子,这是我的 1 张桌子,成员:

+----------+
| 用户 ID |
+----------+
| 1 |
+----------+

和我的表 2,成员 7:

+---------------+---------------+----- ----+
| 总工作年 | 工作范围 | 用户 ID |
+---------------+---------------+----- ----+
| 1 | 金融;药房 | 1 |
| 6 | 医生/诊断;药房 | 1 |
| 10 | 会计;药学 | 1 |
+---------------+---------------+----- ----+

和表 3,成员 7_2:

+-----------------+----------------+---------+
| 总工作年_2 | 知识技能 | 用户 ID |
+-----------------+----------------+---------+
| 1 | 美国广播公司;定义;| 1 |
| 6 | 大众;xyz;def | 1 |
| 10 | 大众;xyz; | 1 |
+-----------------+----------------+---------+

我需要找出regexp 'pharmacy' 所在JobScope的user_id Members7,并且该 regexp pharmacy 的总年数JobScope>=0,还有 regexp 'def' in KnowledgeSkillof Members7_2,并且该 regexp 'def' 的总年数KnowledgeSkill>= 0,

所以现在我们可以看到:

TotalWorkYear = 17

TotalWorkYear_2 = 7

user_id = '1'

这是我的查询:

选择成员.user_id,
SUM(IF(成员7.JobScope
REGEXP 'Pharmacy', Members7.TotalWorkYear, 0 ) ) yearsJobScope, Members7.JobScope AS JobScope,
SUM(IF(成员7_2.KnowledgeSkill
REGEXP 'def', Members7_2.TotalWorkYear_2, 0 ) ) yearsSkill, Members7_2.KnowledgeSkill AS KnowledgeSkill
来自会员
LEFT JOIN Members7 ON Members.user_id = Members7.user_id
左加入 Members7_2 ON Members.user_id = Members7_2.user_id
按 JobScope 正则表达式“药房”分组,
KnowledgeSkill REGEXP 'def', user_id
拥有
JobScope REGEXP '药房'
AND 年工作范围 >=0
和 KnowledgeSkill 正则表达式 'def'
AND 年技能 >=0

但输出是:

+---------------+------------+
| 年工作范围 | 年技能 |
+---------------+------------+
| 17 | 18 |
+---------------+------------+

如果我删除了 HAVING 下的 REGEXP,我可以看到:

+---------+---------------+----------- ----------+------------+-------------- --+
| 用户 ID | 年工作范围 | 工作范围 | 年技能 | 知识技能 |
+---------+---------------+----------- ----------+------------+-------------- --+
| 1 | 1 | 审计与税务;银行/金融;制药 | 6 | 大众;xyz;def |
| 1 | 6 | 医生/诊断;药房 | 6 | 大众;xyz;def |
| 1 | 10 | 一般/成本会计;药房 | 6 | 大众;xyz;def |
+---------+---------------+----------- ----------+------------+-------------- --+

似乎只是TotalWorkYears3 行的总和。

有什么办法可以解决吗?

4

1 回答 1

3

您与多个表的左连接将使某些技能多次计数。重写查询的简单方法是使用其他表的子查询;

SELECT m.user_id, yearsjobscope, yearsskill
FROM members m
JOIN (
  SELECT user_id, SUM(totalworkyear) yearsjobscope
  FROM members7 WHERE jobscope REGEXP 'Pharmacy'
  GROUP BY user_id) m7
  ON m.user_id = m7.user_id
JOIN (
  SELECT user_id, SUM(totalworkyear_2) yearsskill
  FROM members7_2 WHERE KnowledgeSkill REGEXP 'def'
  GROUP BY user_id) m7_2
  ON m.user_id = m7_2.user_id

一个用于测试的 SQLfiddle

最后,如果您的表变大,REGEX这不是一个好方法,您至少需要将分号分隔的值拆分为行,以便索引/精确匹配可以覆盖它们。

于 2013-07-10T06:39:39.340 回答