Я использую подробный синтаксис объединения, чтобы более четко понять, как связаны таблицы.
1) все сообщения, относящиеся к категории
Учитывая имя категории, вам нужно объединить все три таблицы.
select p.*
from post_category c
join post_category_bridge b on c.id = b.category_id
join posts p on p.id = b.post_id
where c.category = ?
2) все категории, которые есть в сообщении
Учитывая идентификатор сообщения, выНужно только присоединиться к таблицам мостов и категорий.
select c.*
from post_category_bridge b
join post_category c on c.id = b.category_id
where b.post_id = ?
3) все сообщения в категории с определенным идентификатором
Я думаю, вы имеете в видупоиск сообщений по category.id
здесь (в отличие от category.name
), который похож на (1), но не требует объединения в таблице категорий, как вы уже знаете идентификатор;вам нужно только присоединиться к бриджу и опубликовать таблицы.
select p.*
from post_category_bridge b
join posts on p.id = b.post_id
where b.category_id = ?
Я буду переносить сайт на SQL Server в день запуска ... POD позаботится об этих различиях или мне понадобитсяпереписать эти запросы.
Это зависит от запросов, которые попадают в вашу систему.Если вы пишете свой собственный SQL, тогда будет иметь значение, будете ли вы использовать функции или синтаксис, уникальные для MySQL, во время разработки.Я настоятельно рекомендую тестировать на SQL Server задолго до дня запуска, иначе запуск может быть отложен на некоторое время.Вы можете скачать бесплатную оценочную версию именно для этой цели.
Точки, упомянутые в комментариях, повторяются:
- как @ freddy упоминает, вам не нужно поле
posts.category_id
.В отношениях «многие ко многим» таблица «мост» (также называемая «соединение», «объединение», «карта», «ссылка» и т. Д.) Связывает сообщения с несколькими категориями - одно поле в таблице posts
будет использоваться, если была разрешена только одна категория . - , как упоминает @ JamieWong , вы должны поддерживать согласованность типов между ключами таблицы и внешними ключами, например, если
posts.id
равно int(11)
тогда post_category_bridge.post_id
также должно быть int(11)
.Большинство (все?) Баз данных, которые применяют ограничения внешнего ключа, потребуют этого (включая MySQL).Зачем?Если a может быть 4294967295 сообщений (что поддерживается 4 байтами int
), то в таблице мостов мало смысла, которая поддерживает связывание только с 255 сообщениями (как поддерживается 1 байтом tinyint
) - Хотяваш на это ... может также сделать идентификаторы (и FK для этих идентификаторов)
unsigned
.