2010-11-18 67 views
1

情況: 我得到消息。新手被張貼在多個類別中。數據庫表關係問題

問題: 如何存儲新聞和類別之間的關係?我應該創建三個表格(新聞,類別,新聞類別)嗎?這是最好的方法嗎?

讓我們來看看例子: 我想查詢最新的新聞數據庫,所以我需要:1。 查詢使用連接來查詢新聞類別 2.循環,查詢獲取類別名稱的消息。

所以,我有10條新聞(10條查詢)×數量的類別=全部查詢。不是太多?

更新
這是我的例子。有三個下面的表格。

-- news -- 
ID 
Title 

-- categories -- 
ID 
Name 

-- news_categories -- 
ID  
NewsID 
CategoryID 

無論我使用什麼查詢,它都會正確返回所有項目和項目類別名稱,但是......項目根據類別數量顯示幾次。也許我太累了或什麼的,但我真的看不到任何解決方案。

更新2
這裏是我的查詢:

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 

,這裏是它的結果:

Title Name 
Test PHP 
Test2 MySQL 
Test2 CSS 

任何人有任何建議,如何解決這個問題?

問候, M.

回答

0

是三個表是正確實行以新聞和新聞分類和類別和新聞分類之間的外鍵。

你查詢可以是這樣返回所有新聞標題爲特定類別名稱:

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 

您可以簡化它,如果你已經知道了類別ID,您可能會從下拉什麼的,然後加入到類別表將是不必要的,你寫的東西,如:

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

與他們在一個逗號類別選擇所有新聞分隔的列表,你需要一個用戶定義函數。這裏所需要的SQL代碼,以幫助與邏輯,但實際執行是由你:

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 

使用上述UDF查詢應該是這樣的:

SELECT Title, fnCategoryList(ID) AS Categories 
    FROM news 

取決於數量記錄在你的新聞表中,這個查詢不會表現的很好。在您編寫的幾乎每個查詢中,都應該有某種形式的WHERE子句。

+0

我想你的答案是正確的,但我遇到了一些問題實施它。我編輯了我的問題,你會很好,看看嗎? – 2010-11-18 20:04:47

+0

我已更新上面的示例查詢以匹配您的示例表。也許我誤解了你所遇到的問題?你在桌子之間有外鍵嗎? news_categories表中是否有重複項(同一個newsid和同一個categoryid多次)?如果您發佈的查詢不起作用,我很樂意看看它。 – theChrisKent 2010-11-18 20:12:14

+0

已經完成。感謝你的協助。 – 2010-11-18 20:32:45