2010-08-05 89 views
0

我遇到了mysql查詢的麻煩。我想得到一個唯一的名稱共享tenant_group_id號碼的配對。您只需要知道每個承租人都有唯一的individual_tenant_id,最多兩個單獨的承租人共享相同的tenant_group_id。MySQL選擇名稱的唯一配對

SELECT t1.first_name, t2.first_name 
    FROM individualtenant t1 
LEFT JOIN individualtenant t2 ON t1.tenant_group_id = t2.tenant_group_id 
          AND t1.individual_tenant_id != t2.individual_tenant_id 

眼下這是給我,但對兩種方式,例如,它會返回「約翰」,「梅利莎」和「梅利莎」,「約翰」,但我只需要一個獨特的配對。

編輯:如果個人中藥沒有合作伙伴,我需要在第二列有NULL。

回答

0

用左做其加入其中一個NULL可能是「沒有第二個租客」或「租客以前排序匹配」可能是相當棘手,我不知道如何處理這些。但是,如果這是您需要的所有數據,並且不需要從其他表中獲取更多數據,我們可以作一點點欺騙(這將是N個值的分離列表,1個或更多):

SELECT GROUP_CONCAT(first_name) 
FROM individualtenant 
GROUP BY tenant_group_id; 

另一個骯髒,骯髒的騙子會(只有1或2名租客):

SELECT MIN(first_name), IF(COUNt(*) > 1,MAX(first_name),NULL) 
FROM individualtenant 
GROUP BY tenant_group_id; 
+0

大獲成功!現在,如果我想計算這些配對,那該怎麼辦?似乎你不能用COUNT()包裝GROUP_CONCAT(first_name),我怎麼做第二個。還有什麼是將這兩個名稱連接成一個分隔空間的好方法? (對不起所有請求) – MCH 2010-08-05 21:46:34

+0

第一個,如果你想計算結果中的成員數量,你只需要第二列'COUNT(*)'(或任何特定的唯一字段)。我不建議用空格分隔名稱,因爲這可能是名稱的合法內容,我建議選擇一個不可打印字符的「SEPARATOR」(請查看「group_concat」工作原理的手冊),所以它或多或少不會出現在'first_name'列中,除非出現一些輸入錯誤。但請注意這是'hackish':仔細選擇你的分隔符,並始終保持警惕/可疑。 – Wrikken 2010-08-06 22:05:14

1

嘗試:

SELECT t1.first_name, t2.first_name 
FROM individualtenant t1 
LEFT JOIN individualtenant t2 
ON t1.tenant_group_id = t2.tenant_group_id 
WHERE t1.individual_tenant_id < t2.individual_tenant_id 
    or t2.individual_tenant_id is null; 
+0

仍然給我相同數量的配對,但第二個配對具有NULL,因爲左連接保留了左邊的所有內容。我應該如何形成這個把這些扔掉? – MCH 2010-08-05 21:25:59

+0

好的,只是切換到Inner Join,它的工作原理:P雖然我想知道如何用可變數量的租戶來做到這一點,並且如果租戶沒有合作伙伴,我確實需要添加NULL。 – MCH 2010-08-05 21:36:31

+0

請嘗試我的更新版本。 – RedFilter 2010-08-06 01:27:57

0

這是你尋求什麼?

SELECT 
t1.first_name AS 'first_tenant', 
t2.first_name AS 'second_tenant' 
FROM 
individualtenant t1, 
individualtenant t2 
WHERE 
    t1.tenant_group_id = t2.tenant_group_id 
AND t1.individual_tenant_id < t2.individual_tenant_id 
UNION 
SELECT 
t1.first_name, 
"No Match" 
FROM 
individualtenant t1 
WHERE NOT EXISTS (
SELECT * 
FROM individualtenant t2 
WHERE 
    t2.individual_tenant_id <> t1.individual_tenant_id 
AND t2.tenant_group_id = t1.tenant_group_id 
)