2012-01-26 2 views
2

제목이 잘 지는지 모르겠지만 일치하는 항목을 제공하는 MySQL 데이터베이스에 대한 SELECT 문을 찾으려고합니다. 나는 두 개의 테이블을 가지고있다.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

좀 더 정확하게 할 수 있습니까? 사용자가 둘 이상의 스킬을 사용할 수 있습니까? 사용자가 둘 이상의 스킬을 요청할 수 있습니까? 일치 여부는 사용자가 요청한 모든 기술과 일치 함을 의미합니까? 일치하는 사용자가 요청에 나열되지 않은 다른 기술을 사용할 수 있습니까? –

+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 

이것은 매우 불충분하지만 작동해야합니다.

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 

사용자를 찾아려면 : 어쩌면 SQLfu whos는 누군가가 나의 기술이 일치하는 두 테이블에서 행의 가능한 모든 조합을 반환이 같은 쿼리로)

+2

+1 for SQLfu 先生 – yoshi

+0

굉장 - 고마워! // 편집 : 신경 쓰지 마라. – paoloP

0

시작을 개선 할 수있는 것보다 더 낫다 '귀하의'제안과 일치하는 기술을 선택하십시오. 여기에서 offering은 '귀하'입니다. '귀하의'요청과 일치하는 사용자와 기술을 찾으려면 requesting이 '귀하'인 곳에서 선택하십시오.

관련 문제