Похожие посты: Получить записи по тегам из разных таблиц - PullRequest
0 голосов
/ 21 октября 2009

Я работаю на новостном сайте. Как и на каждом новостном сайте, будут новости, рубрики, видео и фотогалереи. Я планирую хранить эти разные типы записей в разных таблицах, но связать их с тегами. Вот простая схема:

Таблицы: новости, видео, галереи, столбцы, теги, Post_to_tags

Post_to_tags:
- tagid
- postid
- посттип [новости, видео, галерея, колонка]

Теперь мне нужно получить связанные записи для поста в одном запросе. Легко объединить одну таблицу и получить соответствующие сообщения, но когда дело доходит до разных таблиц ... Есть идеи?

Ответы [ 2 ]

1 голос
/ 21 октября 2009

Возможно, вы захотите сделать это в двух запросах, так как выполнение этого в одном запросе будет довольно уродливым и может не принести вам много пользы с точки зрения скорости.

Таким образом, вы будете использовать теги для получения всех постов, которые имеют отношение, а затем просто объединитесь, чтобы получить статьи и связанные записи, которые относятся к постам.

select n.*, g.*, v.* FROM News n 
   INNER JOIN Galleries g ON(g.postid=n.postid) 
   INNER JOIN Videos v ON(v.postid=n.postid) 
   WHERE n.postid IN(
     (SELECT p.postid FROM Post_to_tags p WHERE ...)
   )

Это должно быть отправной точкой, но я вижу вашу проблему, так как у вас есть посттип.

Почему бы не игнорировать posttype для этого запроса и просто использовать тот же postid для истории, чтобы их можно было легко найти.

0 голосов
/ 21 октября 2009

Если ваш запрос получает одинаковое количество полей с одинаковыми типами данных, вы можете использовать UNION.

SELECT fielda, fieldb FROM news n 
  JOIN post_to_tags p ON (n.post_id=p.post_id) 
  where p.tag_id='x' and p.post_type='news'
UNION
SELECT fielda, fieldb FROM videos v 
  JOIN post_to_tags p ON (v.post_id=p.post_id) 
  where p.tag_id='x' and p.post_type='videos'

Но если это так, вы можете пересмотреть свою схему. Что-то вроде:

  • Опубликовать таблицу с полями, общими для всех типы сообщений и поле флага для сообщений тип
  • Details_X таблицы с конкретными полями набрать Х сообщений

разрешит один запрос:

SELECT fielda, fieldb FROM posts p 
  JOIN post_to_tags pt ON (p.post_id=pt.post_id) 
  where pt.tag_id='x';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...