2009-10-21 6 views
0

Je travaille sur un site d'actualités. Comme chaque site de nouvelles, il y aura des nouvelles, des colonnes, des vidéos et des galeries de photos. Je prévois de conserver ces différents types d'enregistrements dans différentes tables, mais de les relier avec des tags. Voici un schéma simple:Related Posts: Obtenir des enregistrements par des étiquettes de différentes tables

Tables: News, Vidéos, Galeries, Colonnes, Tags, Post_to_tags

Post_to_tags:
- tagid
- postID
- posttype [nouvelles, vidéo, galerie, colonne]

Maintenant, ce que je dois faire est d'obtenir des enregistrements liés pour un poste dans une seule requête. Il est facile de se joindre à une table et d'obtenir des messages connexes, mais quand il s'agit de tables différentes ... Une idée?

+0

Pouvez-vous fournir un peu plus de détails? Ce n'est pas clair ce que vous demandez. –

+0

Pourriez-vous expliquer ce que vous voulez sélectionner exactement? – Granit

+0

Je dois obtenir tous les enregistrements liés de différentes tables. Comme je l'ai dit, il est facile de rejoindre une table, mais je dois rejoindre différentes tables en fonction de posttype. – redrain

Répondre

1

Vous voudrez peut-être le faire dans deux requêtes, comme le faire dans une requête sera assez moche, et ne peut pas vous acheter beaucoup en termes de vitesse.

Ainsi, vous utiliseriez les balises pour obtenir tous les postulats qui se rapportent, puis faites juste une jointure pour obtenir les articles et les enregistrements associés qui se rapportent aux postulats.

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 ...) 
    ) 

Cela devrait être un point de départ, mais je vois votre problème, car vous avez posttype. Pourquoi ne pas ignorer posttype pour cette requête et juste utiliser le même postid, pour l'histoire, de sorte qu'ils ont un moyen d'être recherchés facilement.

0

Si votre requête obtient le même nombre de champs avec les mêmes types de données, vous pouvez utiliser 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' 

Mais si tel est le cas, vous pouvez réexaminer votre schéma. Quelque chose comme:

  • Table postale avec des champs communs à tous types de poste, et un champ de drapeau pour le type de poste
  • tables Details_X avec des champs spécifiques taper les messages X

permettra une requête unique:

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

Merci pour votre suggestion sur le schéma de la table. Je pense aussi. Je pense aussi à stocker post_link et post_title dans la table post_to_tags. Donc je n'aurai pas besoin d'utiliser join. Mais chaque façon a ses propres problèmes. La performance sera très importante. Donc, je cherche une solution "moins chère". – redrain

Questions connexes