0

一致するレコードを返すためにデータベースにクエリを実行しようとしていますが、最も効率的な方法でそれを行う方法がわかりません。TUsers テーブル、TJobsOffered テーブル、TJobsRequested テーブルがあります。UserID は TUsers テーブルの主キーであり、Job テーブル内で 1 対多の関係で使用されます。

最終的に、特定の UserID に基づいて一致するすべてのユーザーのリストを返すクエリを実行したいと考えています (たとえば、一致するユーザーとは、両方のテーブルに一致するレコードが少なくとも 1 つあるユーザーです。たとえば、UserA が TJobsOffered にリストされている jobid 999 を持っていて、UserB が持っている場合) TJobsRequested にリストされている jobid 999 の場合、これは一致します)。

頭を悩ませるために、私はそれを大幅に簡素化し、問題のユーザーのジョブ ID に基づいてレコードを一致させようとしています。

SELECT DISTINCT TJobsOffered.FUserID FROM TJobsOffered, TJobsRequested
WHERE TJobsOffered.FUserID=TJobsRequested.FUserID AND 
(TJobsRequested.FJobID='12' OR TJobsRequested.FJobID='30') AND
(TJobsOffered.FJobID='86' OR TJobsOffered.FJobID='5')

これは正常に機能しているようで、正しい結果を返しますが、TUsers テーブルを導入すると (ユーザー情報にアクセスできるようになります)、誤った結果が返され始めます。次のクエリが上記の結果と同じ結果を返さない理由がわかりません。確かに、コネクタが異なるだけで同じ情報と一致しているからです (または、上記のクエリが実質的に多対多で、2 未満のクエリである)。 1 対多の比較のセット)?

SELECT DISTINCT TUsers.Fid, TUsers.FName FROM TUsers, TJobsOffered, TJobsRequested
WHERE TUsers.Fid=TJobsRequested.FUserID AND TUsers.Fid=TJobsOffered.FUserID AND
(TJobsRequested.FJobID='12' OR TJobsRequested.FJobID='30') AND
(TJobsOffered.FJobID='86' OR TJobsOffered.FJobID='5')

2番目のクエリのどこが間違っているのか、TUsersをどのように組み込むべきかを誰かが説明できれば、結合について理解できないので、それは大歓迎です。ユーザーIDを渡すだけでこれをすべて1つのクエリで実行する方法についてのポインタを私に与えることができれば、それも非常に高く評価されます! :)

本当にありがとう、

デイブ

4

2 に答える 2

1

これを試して

SELECT DISTINCT TJobsOffered.FUserID , TUsers.FName
FROM TJobsOffered
INNER JOIN  TJobsRequested ON TJobsOffered.FUserID=TJobsRequested.FUserID
LEFT JOIN TUsers ON TUsers.Fid=TJobsOffered.FUserID
WHERE  
(TJobsRequested.FJobID (12,30) AND
(TJobsOffered.FJobID IN (86 ,5)
于 2012-06-07T13:30:26.790 に答える
0

where句に「AND TJobsOffered.FUserID=TJobsRequested.FUserID」を追加する必要があります。

于 2012-06-07T13:28:05.213 に答える