İlgili mesajlar: Farklı tablolardan etiketleri kayıtları alın

2 Cevap php


I'm working on a news site. Like every news site there will be news, columns, videos and photo galleries. I'm planning to keep these different types of records in different tables but relate them with tags. Here is a simple schema:

Tablolar: Haberler, Videolar, Galeriler, Kolonlar, Etiketler, Post_to_tags

Post_to_tags:
- tagid
- postid
- posttype [news,video,gallery,column]

Şimdi ne yapmam gerekiyor, tek bir sorguda bir yazı için ilgili kayıtları olsun. O Herhangi bir fikir ... farklı masalarda geldiğinde bir masaya katılmak ve ilgili mesajları almak kolay ama?

2 Cevap

Bir sorguda bunu yapıyor gibi oldukça çirkin olacak ve hız açısından size çok satın olmayabilir Siz, iki sorgularda bunu yapmak isteyebilirsiniz.

Yani o sadece postids ilgili makaleleri ve ilgili kayıtları almak için katılmak yapmak, ilgili tüm postids almak için etiketleri kullanabilirsiniz.

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

Bu bir başlangıç ​​noktası olmalı, ama posttype var gibi ben, senin sorun bakın.

Neden bu sorgu için posttype görmezden ve sadece hikaye için, aynı POSTID kullanın, bu yüzden kolayca aranabilir için bir yol var.

Sorgu aynı veri türleri ile alanların aynı sayıda alıyorsa, UNION kullanabilirsiniz.

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'

Bu durumda ise, sizin şema yeniden isteyebilirsiniz. Gibi bir şey:

  • Post table with fields common to all post types, and a flag field for post type
  • Details_X tables with fields specific to type X posts

Tek bir sorgu sağlayacak:

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