【问题标题】:How to merge two mysql queries efficiently to return matching records?如何有效地合并两个mysql查询以返回匹配记录?
【发布时间】:2012-04-11 16:43:56
【问题描述】:

我相当愚蠢(!),但无法找到为 mysql 编写查询的最佳方法,并认为我会在此处发布它以查看是否有人可以提供帮助(仅供参考,我正在使用 PHP) .我有 5 张桌子:

TUsers (ID, Name) 
TJobTypes (ID, Name) 
TJobs (ID, JobTypeID, JobName) 
TJobsRequested (ID, JobID, UserID) 
TJobsOffered (ID, JobID, UserID) 

仅供参考,TJobsTypes 到 TJobs 是一对多的关系。

用户可以根据他们可以做的工作和需要/提供的工作来搜索工作交换。因此,如果 User1 搜索并说他需要 'JobA' 做并且可以提供 'JobB' 并且 User2 被列为需要 'JobB' 做并且可以提供 'JobA' 那么这将是匹配的。如果 User2 需要 JobB 做但不能提供 JobA,那么它不匹配。编写查询以正确匹配此内容很容易,但用户还需要能够根据一般工作类型(而不是特定工作)进行搜索。

因此,如果 UserA 正在搜索:“需要 JobTypeA”和“可以提供 JobTypeB”,则匹配项应该是所有在 JobTypeA 类别中提供工作并在 JobTypeB 类别中请求工作的用户(如果这有意义的话!)

如果您只是搜索一种方式(例如,在 JobType=$typecanhelp 中显示所有被列为需要工作的用户),那么这很容易,可以通过以下方式完成:

SELECT DISTINCT TUsers.Fid, TUsers.FUsername, TUsers.FGender 
FROM TUsers, TJobsRequested, TJobs, TJobTypes 
WHERE TJobTypes.Fid='$typecanhelp' 
AND TJobs.FJobTypeID=TJobTypes.Fid 
AND TJobs.Fid=TJobsRequested.FJobID 
AND TUsers.Fid=TJobsRequested.FUserID 
ORDER BY TUsers.Fid

或(用于显示列出的所有提供 JobType=$typeneedhelp 工作的用户):

SELECT DISTINCT TUsers.Fid, TUsers.FUsername, TUsers.FGender 
FROM TUsers, TJobsOffered, TJobs, TJobTypes 
WHERE TJobTypes.Fid='$typeneedhelp' 
AND TJobs.FJobTypeID=TJobTypes.Fid 
AND TJobs.Fid=TJobsOffered.FJobID 
AND TUsers.Fid=TJobsOffered.FUserID 
ORDER BY TUsers.Fid

但是我不知道如何将两者合并在一起,因为它们使用相同的基表(TJobs 和 TJobTypes)。有人可以为我指出正确的方向,如何合并上述两个查询,以便返回提供 JobType==$jobcanhelp 工作并需要 JobType=$jobsneedhelp 工作的用户?

【问题讨论】:

  • 我数的是 5 张桌子,而不是 4 张。
  • mysql 是否支持(非递归)CTE 的?
  • @SalmanA:你是对的,我放了 4 而不是 5,我已经更新了这个 :)
  • @wildplasser 我不相信 mysql 支持 CTE,这必须通过 mysql 中的视图来完成。

标签: mysql sql join


【解决方案1】:

如果我理解正确,您想做一个INTERSECT,我认为mysql 不支持它。看来您可以使用 INNER JOIN 来完成与 mysql 相同的操作。查看this similar questionthis page 了解更多信息。

【讨论】:

  • 这会不会只在一个结果集中列出两个查询的结果,而不是实际上只返回匹配两者的结果(即具有匹配的jobrequest 和匹配的joboffer 的用户)?还是我要疯了? :)
  • 对不起,我误解了你的问题。我根据您的评论修改了我的答案。希望对您有所帮助。
  • 非常感谢您的回复,但我是否认为当您使用 INNERJOIN 时,您需要根据某些列在 FROM 子句中 INNERJOIN 2 个表,然后您可以一起使用这些表(例如SELECT a.member_id, a.name FROM a INNER JOIN b USING (member_id, name))?而不是像您所做的那样仅仅内连接 2 个查询?无论如何我都尝试了查询,但它出错了,两个单独的查询都可以正常工作,但不能像这样一起工作。我错过了什么:)?
猜你喜欢
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
  • 2017-07-26
  • 2022-10-17
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多