2010-08-05 2 views
0

У меня возникли проблемы с запросом mysql. Я хочу получить уникальное сопряжение имен, которые имеют один и тот же номер tenant_group_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 

Сейчас это дает мне пары, но оба пути, к примеру, было бы вернуться «Джон», «Melissa» и «Мелисса», «Джон», но мне нужно только уникальное спаривание.

EDIT: И если у индивидуума нет партнера, мне нужно иметь NULL во второй колонке.

ответ

0

Делать это с LEFT JOIN, где 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

Большой успех! Теперь, если я захочу СЧИТАТЬ эти пары. Кажется, вы не можете обернуть GROUP_CONCAT (first_name) с помощью COUNT(), как бы я сделал это для второго. А также, что такое хороший способ объединить эти два имени в один столбец с разделительным пространством? (Извините за все запросы) – MCH

+0

Прежде всего, если вы хотите подсчитать количество членов в результате, у вас будет только второй столбец 'COUNT (*)' (или любое конкретное уникальное поле). Я бы не рекомендовал разделять имена с пространством, поскольку это может быть законным содержимым имени, я бы рекомендовал выбрать «СЕПАРАТОР», который является непечатаемым персонажем (посмотрите на руководство, как работает «group_concat») поэтому более или менее ожидалось, что никогда не будет в столбце «first_name», если не будет некоторая ошибка ввода. Помните, что это «хакерство»: тщательно выберите свой разделитель и всегда будьте бдительны/подозрительны. – Wrikken

1

Try:

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

+0

Хорошо, просто переключился на Inner Join, и это сработало: P Хотя я хотел бы знать, как это сделать с переменным количеством арендаторов, а также мне нужно добавить NULL, если у арендатора нет партнера. – MCH

+0

Попробуйте обновленную версию. – RedFilter

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 
) 
Смежные вопросы