2012-01-26 3 views
2

私はそのタイトルが良いとは分かりませんが、私は一致するアイテムを与えるMySQLデータベースのSELECTステートメントを見つけようとしています。私は2つのテーブルを持っています。MySQLデータベース内のペアを照合してください

例:あなたは私が何を意味するか見

Offers 
------ 
FK_User_ID | FK_Skill_ID | (other columns that are not relevant) 
1   1 
2   2 

Requests 
-------- 
FK_User_iD | FK_Skill_ID | (other columns that are not relevant) 
1   | 2 
2   | 1 

?ユーザー1にスキル1があり、スキル2が求められます。ユーザー2にスキル2があり、スキル1が求められます。

私はユーザー1と言います。私とオファー/リクエストの一致を持つユーザーとスキルを取得するにはどうすればよいですか?

ユーザー1として、私は次のようなデータを取得したいと思います:

FK_User_ID | FK_Skill_ID | Type 
2   1    Request 
2   2    Offer 

を、私は私の問題がクリアされている願っています。どんな助けでも大歓迎です。

詳細:ユーザーは複数のスキルを持つことができ、複数のスキルを要求できます。マッチはすべてのスキルをマッチさせる必要があるわけではなく、少なくとも1つをマッチさせることを意味します。そして私はを知りたいと思います。それで 1つです。マッチするスキルだけです。

+1

もう少し正確になることができますか?ユーザーは複数のスキルを持つことができますか?ユーザーが複数のスキルをリクエストできますか?一致すると、ユーザーはすべての要求されたスキルに一致しますか?一致するユーザーは、要求に記載されていない他のスキルを持つことができますか? –

+0

ありがとう、私は私の質問を編集しました。 – paoloP

答えて

3
SELECT FK_User_ID, FK_Skill_ID, 'Offer' AS Type FROM offers WHERE FK_Skill_ID IN (SELECT FK_Skill_ID FROM requests WHERE FK_User_ID = 1) 
UNION 
SELECT FK_User_ID, FK_Skill_ID, 'Request' AS Type FROM requests WHERE FK_Skill_ID IN (SELECT FK_Skill_ID FROM offers WHERE FK_User_ID = 1) 

このクエリでは、それは、ユーザ1がための要求とユーザ1がオファーを持っているすべての要求を持っているすべてのオファーを返しますID 1.で、ユーザーの要求/オファーのリストを返します。 @Chrisが提案したように、あなたのデータに関する詳細を質問に更新できるのであれば、私はもっと助けになるかもしれません。

UPDATE:

あなたが要求し、提供の両方で一致が必要な場合、それは少しより多くの仕事になります。

SELECT matching_offers.*, 'Offer' as type FROM 
(SELECT FK_User_ID, FK_Skill_ID FROM offers WHERE FK_Skill_ID IN (SELECT FK_Skill_ID FROM requests WHERE FK_User_ID = 1)) AS matching_offers INNER JOIN 
    (SELECT FK_User_ID, FK_Skill_ID FROM requests WHERE FK_Skill_ID IN (SELECT FK_Skill_ID FROM offers WHERE FK_User_ID = 1)) matching_requests ON matching_offers.FK_User_ID=matching_requests.FK_User_ID 
UNION 
SELECT matching_requests.*, 'Request' as type FROM 
(SELECT FK_User_ID, FK_Skill_ID FROM offers WHERE FK_Skill_ID IN (SELECT FK_Skill_ID FROM requests WHERE FK_User_ID = 1)) AS matching_offers INNER JOIN 
    (SELECT FK_User_ID, FK_Skill_ID FROM requests WHERE FK_Skill_ID IN (SELECT FK_Skill_ID FROM offers WHERE FK_User_ID = 1)) matching_requests ON matching_offers.FK_User_ID=matching_requests.FK_User_ID 

これは非常に不十分ですが、うまくいくはずです。たぶんSQLfu whosは誰かは私はそれを改善することができるよりも優れている)のスキルが一致した2つのテーブルの行のすべての組み合わせを返します。このようなクエリ、と

+2

+1 for SQLfu先生 – yoshi

+0

恐ろしい - ありがとう! //編集:Nevermind – paoloP

0

スタート:ユーザーを検索するに

SELECT offers.FK_User_ID as offering, offers.FK_Skill_ID as skill, requests.FK_User_ID as requesting 
FROM offers, requests 
WHERE offers.FK_Skill_ID = requests.FK_Skill_ID 

とあなたのオファーと一致するスキルは、offeringが「あなた」である場合はこちらから選択してください。 「あなたの」リクエストに合ったユーザーとスキルを見つけるには、ここからrequestingが「あなた」であることを選択してください。

関連する問題