6

私は MySQL の初心者で、ここで説明する 4 つのメイン テーブルを持つデータベース システムを使用しています。

http://www.pastie.org/3832181

このクエリが主に使用するテーブルは次のとおりです。

http://www.pastie.org/3832184

かなり単純に見えますよね?

私のクエリの目的は、OpportunityID が NULL である明示的な User のすべての BusinessID を取得することです。これらの BusinessID を取得したら、関連する BusinessName を Business テーブルで検索し、その BusinessName を EmploymentOpportunity の BusinessName(Business) と一致させます。テーブル。

これは、そのアクションを実行するための私のクエリです。

SELECT EmploymentOpportunity.OpportunityID, Business, Description 
FROM UserBusinessOpportunity, Business, EmploymentOpportunity
WHERE UserBusinessOpportunity.BusinessID = 
          (SELECT UserBusinessOpportunity.BusinessID 
          FROM UserBusinessOpportunity 
          WHERE UserBusinessOpportunity.UserID=1 AND
                UserBusinessOpportunity.OpportunityID is NULL) 
       AND UserBusinessOpportunity.BusinessID = Business.BusinessID 
       AND Business.BusinessName = EmploymentOpportunity.Business;

sub-select ステートメントは、BusinessID のサブセットを返すことになっています。これは非常に単純なクエリであると確信していますが、結果が重複し続け、その理由は確かです。結果のセットは 3 のはずですが、24、つまり 3 つの繰り返しセットが 8 回送られてきます。

ありがとう、これを理解するのを手伝ってくれるなら。

4

3 に答える 3

2

キーワードを使用distinctして重複を削除します。

こちらをご覧ください

于 2012-04-22T06:51:15.663 に答える
1

SQL ステートメントで結合を行っているときに、どこかで制約が欠落している可能性があります。あなたの説明から私が得たものからすると、このクエリはあなたにとってうまくいくように思えます.

SELECT 
    User.UserID,
    Business.BusinessID,
    Business.BusinessName
FROM
    User,
    UserBusinessOpportunity,
    Business
WHERE
    User.UserID = 1 AND
    User.UserID = UserBusinessOpportunity.UserID AND
    UserBusinessOpportunity.OpportunityID IS NULL AND
    UserBusinessOpportunity.BusinessID = Business.BusinessID 
于 2012-04-22T07:00:13.140 に答える
1

内部結合を意図していると思いますが、クエリは暗黙的な外部結合です。

null フィールドを使用した結合は、多くの場合、左結合で最適に機能します。

これを試して:

SELECT EmploymentOpportunity.OpportunityID, Business, Description
FROM EmploymentOpportunity
JOIN Business ON Business.BusinessName = EmploymentOpportunity.Business
LEFT JOIN UserBusinessOpportunity USING(BusinessID) 
WHERE
 UserBusinessOpportunity.UserID=1
AND
 UserBusinessOpportunity.OpportunityID is NULL

ジュリアン

于 2012-04-22T07:10:12.720 に答える