#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. после использования вашего кода он возвращает тот же набор результатов. строки дублируются.