Блог и новости переплелись - Присоединяйтесь или Союз или что-то еще?

У меня 4 стола.

news:                news_link:            blog
---------            -----------           ---------
news_id,             news_link_id,         blog_id,  
news_title,          news_link_news_id,    blog_artist_id, 
news_content,        news_link_artist_id   blog_title, 
news_image,                                blog_content,  
news_date,                                 blog_date, 
news_sticky_status,                        blog_date_edited, 
news_sticky_order,                         blog_status,       
news_status,                               blog_keywords
news_keywords, 
news_date_edited 

Другой стол для художника

У меня нет проблем с выполнением базовых соединений, чтобы связать новости с исполнителем, используя файл news_link.

В моей таблице блогов есть artist_id.

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

Вот результат, который я хочу:

title, date, content, status

Я пробовал некоторые соединения. Нужен ли мне профсоюз? Таблицы имеют разные метки, и таблица новостей должна иметь соединение news_link, чтобы иметь смысл.

Каков наилучший способ добиться этого?


person Greybeard    schedule 13.06.2011    source источник
comment
Опубликуйте больше своей схемы - по крайней мере, внешние ключи. Но в двух словах, использование JOIN — это правильный путь.   -  person Jason McCreary    schedule 14.06.2011
comment
Новости - news_id, news_title, news_content, news_image, news_date, news_sticky_status, news_sticky_order, news_status, news_keywords, news_date_edited   -  person Greybeard    schedule 14.06.2011
comment
news_link - news_link_id, news_link_news_id, news_link_artist_id   -  person Greybeard    schedule 14.06.2011
comment
блог - blog_id, blog_artist_id, blog_title, blog_content, blog_date, blog_date_edited, blog_status, blog_keywords   -  person Greybeard    schedule 14.06.2011
comment
Для этой страницы мне нужно только: заголовок, дата, содержание, статус. Но мне нужно знать, когда это новость, а не статья в блоге.   -  person Greybeard    schedule 14.06.2011


Ответы (1)


Я думаю, что нужен union, что-то вроде этого:

<?php
$artist = mysql_real_escape_string($_GET['artist']);
$query = 
"SELECT is_news, title, date, content, status FROM (  
  SELECT
      1 as is_news
    , a.artist_id as id 
    , n.news_title as title
    , n.news_date as date
    , n.news_content as content
    , n.news_status as status
  FROM artist a
  INNER JOIN news_link nl ON (a.artist_id = nl.news_link_artist_id)
  INNER JOIN news n ON (n.news_id = nl.news_link_news_id)
  WHERE a.artist_id = '$artist'
UNION
  SELECT 
      0 as is_news
    , a.artist_id as id
    , b.blog_title as title
    , b.blog_date as date
    , b.blog_content as content
    , b.blog_status as status
  FROM artist a
  INNER JOIN blog b ON (a.artist_id = b.blog_artist_id)
  WHERE a.artist_id = '$artist'
) s
ORDER BY s.id, s.date";

is_news будет 1 для новостей и 0 для блогов.

Если вы выберете несколько исполнителей, запрос отсортирует результаты по исполнителям.

person Johan    schedule 13.06.2011
comment
Спасибо Йохан. Идентификатор исполнителя уже существует как $artist_id — передается в $GET — этот вид присоединения и объединения является новым для меня, поэтому это немного сбивает с толку. Где бы я разместил свой $artist_id и что такое a. н. б. с. в заявлении за? Спасибо еще раз - person Greybeard; 14.06.2011
comment
a, n, s — это псевдонимы для artist, news и т. д. Так что я не ушибаю пальцы. Объединение склеивает два выбора вместе, и есть другой выбор, который смешивает результаты unioned, отсортированные по дате. - person Johan; 14.06.2011
comment
Если вы по какой-то причине не хотите, чтобы поле id не попадало в набор результатов, этот внешний выбор не нужен. Вы можете просто указать предложение ORDER BY после последнего запроса UNION. - person Dan J; 14.06.2011
comment
@djacobson, но это будет сортировать только последний объединенный выбор, а не первый, и я хочу, чтобы они были перепутаны, если только вы не имеете в виду (select... union select ...) order by id - person Johan; 14.06.2011
comment
ааа, у меня голова болит! Я никогда раньше не использовал Union, и меня это очень сбивает с толку... Я поместил это на свою страницу и проверил название, но пока не могу заставить его работать. Я следую запросу с нормальным результатом $ и $ num, и пока он терпит неудачу в $ num_rows - person Greybeard; 14.06.2011
comment
@Greybeard, вы можете использовать каждый (внутренний) выбор по отдельности, союз просто склеивает их вместе. Сначала запустите их отдельно и посмотрите, работают ли они с вашими полями. - person Johan; 14.06.2011
comment
@Greybeard, все равно забыл ,, попробуйте запрос еще раз. - person Johan; 14.06.2011
comment
Хорошо, помогло, теперь я получаю цикл while, который что-то делает. Как бы я назвал результаты, которые я попробовал $s['date']; например, но это не сработало... - person Greybeard; 14.06.2011
comment
Хорошо, кажется, это именно то, что я искал! Я упорядочиваю результаты по дате DESC, и разные типы (новости и блоги) переплетаются. Единственное, как я могу узнать, получаю ли я новость или сообщение в блоге, чтобы я мог немного изменить стиль сообщения - person Greybeard; 14.06.2011
comment
Большое спасибо за эту помощь! Это полностью ответило на то, что я искал, и в то же время научило меня новому способу делать это! - person Greybeard; 14.06.2011