2009-10-21 4 views
0

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

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

Post_to_tags:
- TagID
- сообщения дана
- posttype [новости, видео, галерея, столбец]

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

+0

Можете ли вы предоставить немного более подробную информацию? Непонятно, о чем вы просите. –

+0

Не могли бы вы объяснить, что вы хотите точно выбрать? – Granit

+0

Мне нужно получить каждую связанную запись из разных таблиц. Как я сказал, легко присоединиться к одной таблице, но мне нужно присоединиться к различным таблицам в зависимости от типа публикации. – redrain

ответ

1

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

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

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.

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

0

Если ваш запрос получает одинаковое количество полей с одинаковыми типами данных, вы можете использовать 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 с полями конкретных ввести X сообщения

позволит одиночный запрос:

SELECT fielda, fieldb FROM posts p 
    JOIN post_to_tags pt ON (p.post_id=pt.post_id) 
    where pt.tag_id='x'; 
+0

Спасибо за предложение о схеме таблицы. Я тоже так думаю. Я также думаю хранить post_link и post_title в таблице post_to_tags. Поэтому мне не нужно будет использовать соединение. Но у всех есть свои проблемы. Производительность будет очень важна. Поэтому я ищу «дешевое» решение. – redrain

Смежные вопросы