3个表的内部连接给出重复的结果

Posted

技术标签:

【中文标题】3个表的内部连接给出重复的结果【英文标题】:Inner join of 3 tables giving repeated results 【发布时间】:2014-05-25 01:51:16 【问题描述】:

我有以下 3 个表结构(未提及所有列,仅需要)

user_master

user_id(主键)

名字

员工

employee_id(主键)

user_id(外键)

地产

studexperience_master

exp_id(主键)

user_id(外键)

我有以下 2 个 mysql 查询,从 3 个表中获取数据并显示在 1 个表中的表单显示(以下查询用于搜索结果)。前两个表正在正确连接,但问题是在连接下两个表时(即员工和 studexperience_master) 数据被重复获取,如果相同的 user_id 比 getttin 3 行在 $result 集中应该只有 1 行 3 次,我试过 DISTINCT ALSO FOR SECOND INNER JOIN BUT ISSUE NOT GETTING SOLVE ,HOW THE QUERY SHOULD BE?

$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%'

user_master

user_id- 2

fname-莫妮卡

手机-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

第 1 行

exp_id-1

user_id- 2

工作-税务审计

ROW2

exp_id-2

user_id- 2

工作-增值税审计

【问题讨论】:

@morissette,不,group by 根本不是解决方案。 @morissette group by 给出了唯一的行,但是因为这个我的第一个查询结果得到 显示错误 是的 Rahul 是正确的 group by 不是解决方案 @Durga:由于同一员工的某个表中有多行,因此如果您显示所有 3 个表的示例数据(特别是对于您得到重复的用户),我们可以提供帮助,什么是你得到你的查询和你真正想要的。 员工表中出现问题,首先您需要在子查询中从员工表中获取单行,然后将其连接到其他表或在员工表上设置条件以获得唯一结果。 @ZafarMalik 你能告诉我怎么做吗,我已经在表格中添加了搜索结果的截图 【参考方案1】:

只需像下面这样更改您的两个查询

而不是加入 emp.user_id 加入 um.user_id 因为它是 PK 并且应该有唯一的数据。

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,提供您的表架构(不是完整的,而是查询中包含的那些列)和一些示例数据。那可以看看。【参考方案2】:

试试下面的查询:

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是资源” 由于这个原因需要完整的信息..请检查以下(状态像'%Fresher%'和熟悉的像'%Tally%'并且像'Excise Audit'和ecountry像'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%' 或完成REGEXP '%|CA CPT%' OR persuing REGEXP '%|CA CPT%') 列不应属于 studexperience_master 表,并且您是否正在传递所有参数....为了安全起见,首先检查带有值的简单查询,然后您可以尝试使用变量。【参考方案3】:

你可以试试这样的东西。如果学生体验主表有重复,那么只需尝试获取前一条记录(根据某些条件,您可以根据需要对此记录进行过滤)。

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)

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

【讨论】:

以上是关于3个表的内部连接给出重复的结果的主要内容,如果未能解决你的问题,请参考以下文章

两个不同表上的 group_concat 在第二个表上给出重复的结果

mysql用总和加入3个表给出错误的结果

Postgres 使用跨 2 个表的内部连接进行更新?

用于 4 个表的 SQL Server 2008 连接类型

具有相同列名的命名查询内部连接表的重复数据/值

从 MySQL 中具有不同列的表的多个连接结果中删除重复项