2011-06-13 8 views
2

J'ai 4 tables.Blog et nouvelles entremêlées - Rejoindre ou Union ou autre chose?

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 

L'autre tableau est pour l'artiste

Je n'ai pas de problèmes de base d'effectuer un lien entre les jointures des éléments de nouvelles à l'artiste en utilisant la news_link.

La table de mon blog comporte l'identifiant de l'artiste.

Je souhaite afficher les entrées de blog par date sur une page d'artiste spécifique et afficher les éléments d'actualité associés à cet artiste dans l'article de blog.

Voici la sortie que je veux:

title, date, content, status 

J'ai essayé quelques-uns rejoint. Ai-je besoin d'un syndicat? Les tables ont des étiquettes différentes, et la table des nouvelles aurait besoin de la jointure news_link pour avoir du sens.

Quelle est la meilleure façon d'y parvenir?

+1

Publiez plus de votre schéma - au moins les clés étrangères. Mais en un mot, utiliser 'JOIN 'est la solution. –

+0

Nouvelles - news_id, news_title, news_content, news_image, news_date, news_sticky_status, news_sticky_order, news_status, news_keywords, news_date_edited – Greybeard

+0

news_link - news_link_id, news_link_news_id, news_link_artist_id – Greybeard

Répondre

0

Je pense que union est nécessaire, quelque chose comme ceci:

<?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"; 

Le is_news sera 1 pour les articles de nouvelles et 0 des articles de blog.

Si vous sélectionnez plusieurs artistes, la requête triera le résultat par artiste.

+0

Merci Johan. L'identifiant de l'artiste est déjà là comme $ artist_id - passé dans un $ GET - Ce type de jointure et d'union est nouveau pour moi, donc c'est un peu déroutant. Où pourrais-je me placer $ artist_id et quels sont les a. n. b. s. dans la déclaration pour? Merci encore – Greybeard

+0

Les a, n, s sont des alias pour 'artist',' news' etc. Donc je ne me meurtris pas les doigts. L'union colle les deux sélections ensemble et il y a un autre select qui mélange les résultats 'union' triés par date. – Johan

+0

Sauf si vous êtes désespéré de garder le champ 'id' hors du jeu de résultats pour une raison quelconque, cette sélection externe n'est pas nécessaire. Vous pouvez simplement spécifier la clause ORDER BY après la dernière requête UNIONed. –