2013-03-04 4 views
0

Мой запрос:SQL 2 одинаковые строки

SELECT CONCAT(f.name, ' ', f.parent_names) AS FullName, 
     stts.name AS 'Status', 
     u.name AS Unit, 
     city.name AS City, 
     hus.mobile1 AS HusbandPhone, 
     wife.mobile1 AS WifePhone, 
     f.phone AS HomePhone, 
     f.contact_initiation_date AS InitDate, 
     fh.created_at AS StatusChangeDate, 
     cmt.created_at AS CommentDate, 
     cmt.comment AS LastComment 
FROM families f 
JOIN categories stts ON f.family_status_cat_id = stts.id 
JOIN units u ON f.unit_id = u.id 
JOIN categories city ON f.main_city_cat_id = city.id 
JOIN contacts hus ON f.husband_id = hus.id 
JOIN contacts wife ON f.wife_id = wife.id 
JOIN comments cmt ON f.id = cmt.commentable_id 
AND cmt.created_at = 
    (SELECT MAX(created_at) 
    FROM comments 
    WHERE commentable_id = f.id) 
JOIN family_histories fh ON f.id = fh.family_id 
AND fh.created_at = 
    (SELECT MAX(created_at) 
    FROM family_histories 
    WHERE family_id = f.id 
     AND family_history_cat_id = 1422) 
WHERE f.id = 17883 

Вопрос: результат 2 строки - но они такие же. Почему я получаю 2 результата, а не только один?

+1

Это зависит от структур таблиц и данных в ваших таблицах. Можете ли вы добавить описание соответствующих структур таблиц к вашему вопросу? – Melanie

+1

Это связано с ПРИСОЕДИНЕНИЕМ. Используйте ключевое слово 'DISTINCT' для получения отдельных строк. –

+0

Какой из идентификаторов, используемых в JOIN, ** гарантирован ** (а не только предполагается) ** уникальным **? –

ответ

1

Возможно, существует двойное отношение к комментариям или family_hystories, вы можете проверить это, вернув *. Где-то должно быть какое-то различие.

Положить полный результат, чтобы найти проблему.

Вы можете (но не рекомендуется) решить его, установив DISTINCT.

SELECT DISTINCT CONCAT(f.name, ' ', f.parent_names) AS FullName, stts.name AS 'Status', u.name AS Unit, city.name AS City, hus.mobile1 AS HusbandPhone, wife.mobile1 AS WifePhone, f.phone AS HomePhone, f.contact_initiation_date AS InitDate, fh.created_at AS StatusChangeDate, cmt.created_at AS CommentDate, cmt.comment AS LastComment 
FROM families f JOIN categories stts ON f.family_status_cat_id = stts.id 
JOIN units u ON f.unit_id = u.id 
JOIN categories city ON f.main_city_cat_id = city.id 
JOIN contacts hus ON f.husband_id = hus.id 
JOIN contacts wife ON f.wife_id = wife.id 
JOIN comments cmt ON f.id = cmt.commentable_id AND cmt.created_at = (SELECT MAX(created_at) FROM comments WHERE commentable_id = f.id) 
JOIN family_histories fh ON f.id = fh.family_id AND fh.created_at = (SELECT MAX(created_at) FROM family_histories WHERE family_id = f.id AND family_history_cat_id = 1422) 
WHERE f.id = 17883 
+1

Мое мнение, что просто использовать разные не очень хороший подход. Если есть дубликаты данных, и вы ничего не можете с этим поделать, у вас действительно нет выбора. Но если дублирование происходит, потому что вы не фильтруете правильно, использование отдельных объектов просто скрывает ошибку, которая может иметь нежелательные последствия для будущего. – invertedSpear

+0

Вы были правы! У family_histories было 2 разных идентификатора. Большой! –

1

Когда вы соединяете таблицы, где есть один-ко-многим появитесь, чтобы получить несколько строк вернулись, когда на самом деле строка существует только один раз в главной таблице, но есть несколько рядов связанных данных в одной из дочерних таблиц.

Также имейте в виду, что ожидаемые данные могут отсутствовать, поскольку в дочерних таблицах нет соответствующих записей, в этом случае используйте LEFT JOIN.

Смежные вопросы