#mysql #join #mysql-8.0
Вопрос:
Я пытаюсь удалить категорию с элементами в ней.
У меня есть 4 стола :
Категории
катИд
Публикации
post_id
Изображения
image_post_id
Теги
tag_post_id
Мой sql-запрос выглядит так для выбора и отмены ссылок на изображения :
SELECT * FROM categories, posts, images, comments, tags
WHERE catId = 25
AND post_catId = catId
AND image_post_id = post_id
AND comment_post_id = post_id
AND tag_cat_id = catId
AND tag_post_id = post_id
но в нем не отображаются сообщения, в категории более 100 сообщений.
когда я ищу только по категориям и публикациям, он отображает все.
Комментарии:
1.
FROM categories, posts, images, comments, tags
Я считаю, что это перекрестное соединение в MySQL2. Не пишите такие соединения. Используйте правильный
join
синтаксис сon
критериями того, как связано соединение. Тоwhere
должно быть для чего возвращаться, а не вступать в отношения.
Ответ №1:
Вы используете ВНУТРЕННЕЕ СОЕДИНЕНИЕ, с его помощью вы получите результаты, когда соответствующие записи будут найдены во всех 4 таблицах. Вам нужно использовать ЛЕВОЕ СОЕДИНЕНИЕ, аналогично этому:
SELECT * FROM categories
LEFT JOIN posts on post_catId = catId
LEFT JOIN images ON image_post_id = post_id
LEFT JOIN comments ON comment_post_id = post_id
LEFT JOIN tags ON tag_cat_id = catId AND tag_post_id = post_id
WHERE catId = 25;
Затем вы увидите все данные, относящиеся к вашему catid=25.
Комментарии:
1. Я должен использовать имя таблицы в качестве псевдонима, не нужно присоединяться dev.mysql.com/doc/refman/8.0/en/select.html в любом случае , спасибо.
2. Псевдоним НЕ является обязательным, вы можете использовать псевдоним (или имя таблицы непосредственно с точечной нотацией), если ваше условие объединения включает столбцы с одинаковыми именами.