3张表的内连接导致结果重复

4

我有以下3个表结构(只列出所需列):

user_master

user_id(主键)

fname

employee

employee_id(主键)

user_id(外键)

estate

studexperience_master

exp_id(主键)

user_id(外键)

我有以下2个MySQL查询,从3个表中获取数据,并在表单中显示为1个表格(以下查询用于搜索结果)。前两个表能够正确地连接,但问题是,当连接下面两个表(即employee和studexperience_master)时,如果同一user_id出现3次,则获取的数据会重复,导致$result集合中出现3行而不是1行。我尝试了DISTINCT也加到第二个INNER JOIN上,但仍然无法解决问题,请问该如何编写查询语句?

$get_work=mysql_query("SELECT DISTINCT wm.work,wm.status FROM user_master um 
INNER JOIN employee emp ON um.user_id =emp.user_id 
INNER JOIN studexperience_master wm 
ON emp.user_id=wm.user_id 
WHERE wm.display='Y' $status_val $company_val $searchkind_val $location_val 
$search_Qualification_val");

        SELECT um.user_id,
       um.fname,
       um.lname,
       um.email,
       um.mobile,
       emp.employee_id,
       emp.ecountry,
       emp.estate,
       emp.ecity,
       emp.prefcities,
       emp.ca,
       emp.cs,
       emp.cwa,
       emp.completed,
       emp.persuing
FROM user_master um
INNER JOIN employee emp 
ON um.user_id =emp.user_id
INNER JOIN studexperience_master wm 
ON emp.user_id=wm.user_id
WHERE wm.display='Y' $status_val 
$company_val $searchkind_val $location_val 
$search_Qualification_val

而where子句的值属于像这样的值
WHERE wm.display='Y' AND status LIKE '%Fresher%' AND efamiliar LIKE '%Tally %' AND work LIKE 'Excise Audit' AND ecountry LIKE 'pune' OR ecity LIKE 'pune' OR estate LIKE 'pune' OR prefcities LIKE 'pune' AND ca REGEXP '%|CA CPT%' OR cs REGEXP '%|CA CPT%' OR cwa REGEXP '%|CA CPT%' OR completed REGEXP '%|CA CPT%' OR persuing REGEXP '%|CA CPT%'

我在用户主表中有两个用户,他们在第三个表中各自的工作,现在对于Monika,有2行记录,对于Dinesh,有3行记录(在第三个表中),所以总共有5行记录,但实际上应该只有2行,并且在最后一列中,我显示了表中“工作”列的所有工作,而实际上应该只显示特定用户的各自工作

用户主表

用户ID- 2

名字- Monika

电话- 2147...

电子邮件- a@a.b

员工

   >employee_id- 1

    >user_id- 2

    >ecity- Amravati

    >ca- CA IPCC Appeared

    >cs- CS Executive Appeared

    >cwa- CWA Inter Appeared   

studexperience_master

ROW1

exp_id-1

user_id- 2

work- 税务审计(Tax AUDIT)

ROW2

exp_id-2

user_id- 2

work- 增值税审计(VAT AUDIT)


@morissette的group by语句可以提供唯一的行,但是由于这个原因我的第一个查询结果显示错误。是的,Rahul是正确的,group by不是解决方案。 - Durga
@Durga:由于某些表中出现了同一员工的多行数据,因此如果您展示所有3个表的样本数据(尤其是在获取重复数据的用户处),并说明您的查询结果及您真正想要的结果,我们可以为您提供帮助。 - Zafar Malik
@ZafarMalik,您能否展示一下如何做到这一点?我已经在表格中添加了搜索结果的截图。 - Durga
您的查询显示的列与报告截图不同。如果您提供完整的细节,我可以进行检查。 - Zafar Malik
@ZafarMalik 我已经添加了显示数据表格的代码。 - Durga
显示剩余8条评论
3个回答

0

只需将您的两个查询更改如下:

不要使用emp.user_id连接,而是使用um.user_id连接,因为它是主键,应该具有唯一数据。

SELECT DISTINCT wm.work,wm.status  
FROM user_master um  
INNER JOIN employee emp  
ON um.user_id =emp.user_id  
INNER JOIN studexperience_master wm  
ON um.user_id=wm.user_id and wm.display='Y' 

第二个查询如下

   SELECT um.user_id,
   um.fname,
   um.lname,
   um.email,
   um.mobile,
   emp.employee_id,
   emp.ecountry,
   emp.estate,
   emp.ecity,
   emp.prefcities,
   emp.ca,
   emp.cs,
   emp.cwa,
   emp.completed,
   emp.persuing
FROM user_master um
INNER JOIN employee emp 
ON um.user_id =emp.user_id
INNER JOIN studexperience_master wm 
ON um.user_id=wm.user_id and wm.display='Y'

虽然我无法理解你的where中那些变量的含义,但是你的where看起来很奇怪。

WHERE wm.display='Y' $status_val $company_val $searchkind_val $location_val 
$search_Qualification_val

这件事情并不能解决问题,因为即使在员工表中,我也有唯一的user_id值,我已经在问题编辑中提到了where子句的值。 - Durga
@Durga,请提供您的表模式(不必全部,只需包含在查询中的列)和一些样本数据。然后我们可以看一下。 - Rahul

0

请尝试以下查询:

SELECT distinct um.user_id,
       um.fname,
       um.lname,
       um.email,
       um.mobile,
       emp.employee_id,
       emp.ecountry,
       emp.estate,
       emp.ecity,
       emp.prefcities,
       emp.ca,
       emp.cs,
       emp.cwa,
       emp.completed,
       emp.persuing
FROM user_master um
INNER JOIN employee emp 
ON um.user_id =emp.user_id
INNER JOIN 
(SELECT DISTINCT user_id FROM studexperience_master WHERE <your ALL conditions ON this TABLE>) wm 
ON emp.user_id=wm.user_id
WHERE $status_val 
$company_val $searchkind_val $location_val 
$search_Qualification_val;

不,它没有工作,查询本身没有被执行,出现错误“mysql_num_rows()期望参数1为资源”。 - Durga
由于这个原因,需要完整的信息。请检查以下内容:(status LIKE '%Fresher%' AND efamiliar LIKE '%Tally %' AND work LIKE 'Excise Audit' AND ecountry LIKE 'pune' OR ecity LIKE 'pune' OR estate LIKE 'pune' OR prefcities LIKE 'pune' AND ca REGEXP '%|CA CPT%' OR cs REGEXP '%|CA CPT%' OR cwa REGEXP '%|CA CPT%' OR completed REGEXP '%|CA CPT%' OR persuing REGEXP '%|CA CPT%') 列不应属于studexperience_master表,并且您是否传递了所有参数...为了安全起见,首先您可以检查带有值的简单查询,然后再尝试使用变量。 - Zafar Malik

0

你可以尝试这样做。如果学生经验主表中有重复记录,则尝试仅获取顶部一条记录(根据某些条件,您可以按照自己的意愿对这些记录进行筛选)。

Select * from user_master UM
inner join employee EMP on UM.UserId = EMP.UserId
inner join studexperience_master USM on EMP.UserId = (SELECT  TOP 1 UserId FROM studexperience_master RJK WHERE USM.UserId = RJK.UserId)

如果有任何问题或需要帮助,请告诉我,:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接