Проблема с использованием MySQL Join

#mysql

#mysql

Вопрос:

у меня есть запрос MySQL SELECT, который извлекает данные из 6 таблиц с использованием Mysql JOIN. вот запрос MySQL, который я использую.

 SELECT
u.id,u.password,
u.registerDate,
u.lastVisitDate,
u.lastVisitIp,
u.activationString,
u.active,
u.block,
u.gender,
u.contact_id,
c.name,
c.email,
c.pPhone,
c.sPhone,
c.area_id,
a.name as areaName, 
a.city_id, 
ct.name as cityName, 
ct.state_id,
s.name as stateName,
s.country_id,
cn.name as countryName
FROM users u
LEFT JOIN contacts c ON (u.contact_id = c.id)
LEFT JOIN areas a ON (c.area_id = a.id)
LEFT JOIN cities ct ON (a.city_id = ct.id)
LEFT JOIN states s ON (ct.state_id = s.id)
LEFT JOIN countries cn ON (s.country_id = c.id)
  

хотя запрос работает отлично, иногда он возвращает повторяющиеся результаты, если находит какие-либо повторяющиеся значения при использовании LEFT JOIN. например, в таблице contacts существуют две строки с идентификатором области ‘2’, что приводит к возврату другой дублированной строки. как мне выполнить запрос, чтобы выбрать только требуемый результат без какой-либо повторяющейся строки. существует ли какой-либо другой тип соединения MySQL, который я должен использовать?

Спасибо

Обновить :

вот таблица контактов, столбец area_id может иметь несколько повторяющихся значений.

введите описание изображения здесь

ОТВЕТ :

в моем состоянии была ошибка в последнем ЛЕВОМ соединении, где я использовал (s.country_id = c.id) вместо того, чтобы это должно было быть (s.country_id = cn.id) после разделения запроса и индивидуального тестирования я смог отследить ошибку. спасибо за ваш ответ. теперь все работает отлично.

Ответ №1:

Дублирование строк, как вы упомянули, похоже, указывает на проблему с данными.

Если users ваша самая детализированная таблица, этого не должно произойти.
Тогда я бы предположил, что у одного пользователя может быть несколько записей в contacts

Вы могли бы использовать DISTINCT , как упоминалось @dxprog, но я думаю, что это GROUP BY здесь более уместно. GROUP BY какая бы точка данных ни была потенциально дублирована…. В конце концов, если у пользователя есть соответствующие записи контактов, к какой из них вы собираетесь обратиться JOIN ?

Вы должны указать это, если хотите удалить «дубликаты», потому что, насколько это касается СУБД, две строки, совпадающие

  LEFT JOIN contacts c ON (u.contact_id = c.id)
  

На самом деле, они уже различны

Ответ №2:

Я думаю, что DISTINCT может быть тем, что вы ищете:

 SELECT DISTINCT
u.id,u.password,
u.registerDate,
u.lastVisitDate,
u.lastVisitIp,
u.activationString,
u.active,
u.block,
u.gender,
u.contact_id,
c.name,
c.email,
c.pPhone,
c.sPhone,
c.area_id,
a.name as areaName, 
a.city_id, 
ct.name as cityName, 
ct.state_id,
s.name as stateName,
s.country_id,
cn.name as countryName
FROM users u
LEFT JOIN contacts c ON (u.contact_id = c.id)
LEFT JOIN areas a ON (c.area_id = a.id)
LEFT JOIN cities ct ON (a.city_id = ct.id)
LEFT JOIN states s ON (ct.state_id = s.id)
LEFT JOIN countries cn ON (s.country_id = c.id)  

Это должно возвращать только строки, в которых идентификатор пользователя отличается, хотя вы можете получить не все объединенные данные, на которые надеялись.

Комментарии:

1. после использования вашего кода он возвращает тот же набор результатов. строки дублируются.