2010-11-18 22 views
1

Durum: Haberim var. NE'lar birden çok kategoride yayınlanır.Veritabanı Tablosu İlişkileri Sorun.

Sorun: Haberler ve kategoriler arasındaki ilişkiler nasıl saklanır? Üç tablo (haberler, kategoriler, haberler) oluşturmalı mıyım? Bu mümkün olan en iyi yöntem mi?

en örnek görelim: Ben son haberler için veritabanını sorgulamak istiyorum, bu yüzden gerek: kategoriler adını almak için haber kategorilerine döngüde 2. sorgu için sorgu katılmak kullanarak haber için 1. sorgusu.

Yani, 10 haber (10 sorgu) X kategori sayısı = toplam sorgu var. Çok fazla değil?

Güncelleme İşte benim örnek. Aşağıdaki üç tablo vardır.

-- news -- 
ID 
Title 

-- categories -- 
ID 
Name 

-- news_categories -- 
ID  
NewsID 
CategoryID 

olursa olsun kullandığınız sorgu, tüm projelerini döner ve kategoriler isimleri doğru ancak ... projeler kategorilere miktarına göre, birkaç kez görüntülenir yansıtır. Belki çok yorgunum ya da bir şeyim, ama gerçekten bir çözüm göremiyorum.

Güncelleme 2 İşte
var benim sorgu:

Title Name 
Test PHP 
Test2 MySQL 
Test2 CSS 

Herkes nasıl bu sorunu çözmek için herhangi bir öneri vardır:

SELECT N.Title, C.Name 
    FROM x_news_categories AS NC 
    INNER JOIN x_news AS N 
     ON N.ID = NC.NewsID 
    INNER JOIN x_categories AS C 
     ON C.ID = NC.CategoryID 

ve burada onun sonucudur?

Selamlar, M.

cevap

0

Evet üç tablo haber ve newscategory ve kategori ve newscategory arasındaki yabancı anahtarlarla doğru implemenation olduğunu.

Sen sorgu böyle bir şeyin belirli bir kategori adı için tüm haberler Başlıkları dönmek için olabilir: Zaten Categoryıd, bilse

SELECT N.Title 
    FROM news_categories AS NC 
    INNER JOIN news AS N 
     ON N.ID = NC.NewsID 
    INNER JOIN Categories AS C 
     ON C.ID = NC.CategoryID 
    WHERE C.Name = @Category 

Bunu basitleştirmek verebilecek bir açılır menüden hangi muhtemelen olur falan, o zaman gereksiz olacağını Kategori tabloya katılın ve benzeri şeyler yazmak: bir kullanıcı tanımlı işlevi gerekir ayrılmış listesi

SELECT N.Title 
    FROM news_categories AS NC 
    INNER JOIN news AS N 
     ON N.ID = NC.NewsID 
    WHERE NC.CategoryID = @CategoryID 

virgül kendi kategorileri ile Tüm Haberler öğeleri seçmek için. İşte SQL kod mantığı ile yardımcı olmak için gerekli, ancak gerçek uygulama size kalmış:

SELECT Title, fnCategoryList(ID) AS Categories 
    FROM news 

sayısına bağlı olarak: şu şekilde görünecektir yukarıdaki UDF Sorgunuzla kullanma

CREATE FUNCTION fnCategoryList 
(
    @NewsID INT 
) 
RETURNS VARCHAR(1000) 
AS 
BEGIN 
    DECLARE @CategoryList VARCHAR(1000) 
    SET @CategoryList = '' 

    SELECT @CategoryList = COALESCE(@CategoryList + ',','') + C.[Name] 
     FROM news_categories AS NC 
      INNER JOIN categories AS C 
       ON NC.CategoryID = C.ID 
     WHERE NC.NewsID = @NewsID 

    RETURN @CategoryList 
END 

haber tablonuzdaki kayıtlar, bu sorgu çok iyi performans göstermeyecektir. Yazdığınız neredeyse her sorguda bir WHERE yan tümcesi olmalıdır.

+0

Sanırım cevabınız doğru, ancak bunları uygulamakta sorun yaşıyorum.Sorumu düzenledim, çok hoş olur musun ve bir bakabilir misin? –

+0

Örnek tablolarınızı eşleştirmek için yukarıdaki örnek sorgularımı güncelledim. Belki de yaşadığınız problemi yanlış anlıyorum. Tablolar arasında yabancı anahtarların var mı? News_categories tablosunda kopyalar var mı (aynı newsid ve aynı categoryid birden çok kez)? Çalışmayan bir sorgu gönderiyorsanız, ona bir göz atmaktan memnuniyet duyarız. – theChrisKent

+0

Zaten bitmiş. Yardımınız için teşekkürler. –

İlgili konular