Как запросить много ко многим - PullRequest
1 голос
/ 29 июня 2010

Я пытаюсь сделать много-много запросов по этим полям.Я хотел бы получить:

1) все сообщения в категории

2) все категории в сообщении

3) все сообщениякоторые находятся в категории с определенным идентификатором

    posts
+-------------+--------------+
| id          | int(11)      |
| title       | varchar(255) |
| body        | text         |
| parent_id   | int(11)      |
| category_id | int(11)      |
+-------------+--------------+
    post_categories 
+----------+--------------+
| id       | int(11)      |
| category | varchar(255) |
+----------+--------------+
    post_category_bridge
+-------------+-------------+
| id          | int(11)     |
| post_id     | int(11) |
| category_id | int(11) |
+-------------+-------------+

Одна вещь, о которой я беспокоюсь, это то, что я использую PDO PHP на БД MySQL для разработки, но я буду переносить сайт на SQLСервер в день запуска.Я знаю, что есть различия между MySQL и SQL Server.POD позаботится об этих различиях или мне нужно будет переписать эти запросы.

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 29 июня 2010

Я использую подробный синтаксис объединения, чтобы более четко понять, как связаны таблицы.

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.
0 голосов
/ 29 июня 2010

select a.*  from posts a, post_categories b, post_category_bridge c 
WHERE 
     b.category="mycat" AND 
     b.id=c.category_id AND 
     a.id = c.post_id;

select b.category from posts a, post_categories b, post_category_bridge c,
WHERE
    c.post_id='PostID' AND
    b.id = c.category_id;


select a.*  from posts a, post_categories b, post_category_bridge c 
WHERE 
     b.category="mycat" AND 
     c.category_id = b.id AND 
     c.post_id = 'MyID' AND
     a.id = c.post_id;
0 голосов
/ 29 июня 2010

Помогает ли это?

1:

select p.* from posts p, post_categories c
where p.category_id=c.id and category='something'

2:

select c.* from post_categories, posts p
where p.category_id=c.id and post_id=something

3:

select p.* from post_categories, posts p
where p.category_id=c.id and post_id=something and category='something'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...