2010-08-05 85 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 
)