@KirillDe777

Как произвести объединение таблиц в mysql?

Доброго времени суток. Столкнулся с такой проблемой. Мне нужно вывести данные из таблиц, первая таблица user_conversation вторая conversation, объединяю их по полю id_conversation.
Запрос выглядит так:
SELECT * from `conversation` JOIN `user_conversation` ON `conversation`.`id_conversation` = `user_conversation`.`id_conversation` WHERE `conversation`.`id_conversation` = 1
В итоге он выводит декартово произведение, хотя я их объединяю по одному полю, это видно в запросе.
Как избавиться от этого декартового произведения.
  • Вопрос задан
  • 2856 просмотров
Пригласить эксперта
Ответы на вопрос 4
@carm
На всякий случай визуальное представление объединений:
Visual_SQL_JOINS_V2.png
www.codeproject.com/Articles/33052/Visual-Represen...
Ответ написан
Комментировать
TekVanDo
@TekVanDo
Javascript Developer
Если я правильно понял нужно использовать INNER JOIN вмеcто JOIN
Ответ написан
@KirillDe777 Автор вопроса
Нет не являются, ни одно, разве так нельзя объединять?
Ответ написан
Комментировать
@0LLEGator
"Начинающий" программист в средней компании.
А где ответ на первый вопрос, про тип связи? Он самый главный. Видимо "многие-ко-многим".
"Разруха не в сортирах, разруха в головах"
Судя по всему, декартово произведение у вас не в запросе, который отрабатывает правильно, а в таблицах, в которых значений мало и они сильно пересекаются, а то и вообще во впечатлении от выборки.
Запрос выдаёт ВСЕХ пользователей, связанных с КАЖДОЙ записью беседы (видимо всех участников конкретной беседы, если я правильно понял смысл названий.
Так вот, SQL так устроен, что вместо
Беседа 1:
- Участник 1
- Участник 2
- Участник 4

Выводит
Беседа 1, Участник 1
Беседа 1, Участник 2
Беседа 1, Участник 4

Что не является пересечением (участник 3 не был выведен, т.к. принимал участие в другой беседе), но может таким выглядеть. Рекомендую для теста ввести около 3 бесед и 10 участников, в каждой беседе не более 3 участников в произвольных сочетаниях, и добавьте сортировку по `conversation`.`id_conversation` тогда будет отчётливо видно, как работает.
И да, изучите вопрос первичных ключей (ПК), их назначения и ОБЯЗАТЕЛЬНО используйте. Здесь, например, исходя из логики запроса напрашиваются`conversation`.`id_conversation`, хотя бы. И нормальные формы БД тоже...
Для проверки сравните количество строк в запросах
SELECT * FROM `user_conversation` 
SELECT * FROM `user_conversation`  WHERE `user_conversation`.`id_conversation` = 1

С количеством строк, которые выводит ваш запрос.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы