2010-11-18 87 views
1

状況: 私はニュースを得ました。 NEwsは複数のカテゴリに掲載されています。データベーステーブル関係の問題

問題: ニュースとカテゴリの関係を保存する方法は? 3つのテーブル(ニュース、カテゴリ、ニュースカテゴリ)を作成する必要がありますか?これが可能な最良の方法ですか?

のは例を見てみましょう: は、私は最新のニュースをデータベースに照会したいので、私は行う必要があります。カテゴリ名を取得するには、ニュースカテゴリのループで 2.クエリを照会するために結合を使用してニュースを 1.クエリを。

したがって、10個のニュース(10個のクエリ)X個のカテゴリ=合計クエリがあります。多すぎない程度に?

更新
これは私の例です。次の3つの表があります。

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

はい3つのテーブルには、ニュースやnewscategoryとカテゴリとnewscategory間の外部キーで正しいimplemenationです。

あなたしているクエリは、特定のカテゴリ名のすべてのニュースタイトルを返すために、このようなものが考えられます。

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 

すでに区分を知っていた場合は、それを簡略化することができ、あなたはおそらく、ドロップダウンからと思われますまたは何かが、その後、不要になりますカテゴリーテーブルに参加して、あなたのような何かを書く:あなたは、ユーザー定義関数を必要とするリストを分離

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

はカンマでのカテゴリとすべてのニュース項目を選択します。ここではSQLロジックを支援するために必要なコードが、実際の実装はあなた次第です:上記のUDFを使用して

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 

はあなたのクエリは次のようになります。

SELECT Title, fnCategoryList(ID) AS Categories 
    FROM news 

の数に応じて、あなたのニューステーブルのレコードは、このクエリはあまりうまく動作しません。あなたは、あなたが書いたほぼすべてのクエリに対して、何らかの形のWHERE句を用意する必要があります。

+0

あなたの答えは正しいと思いますが、それを実装する際に問題があります。私は私の質問を編集しました、あなたはとても素敵で見てみませんか? –

+0

上記のサンプルクエリをサンプルテーブルに合わせて更新しました。おそらく私はあなたが持っている問題を誤解していますか?あなたはテーブルの間に外部キーを持っていますか? news_categoriesテーブルに同じ重複がありますか(同じニュースIDと同じcategoryIDを複数回)?うまくいかないクエリを投稿すると、私はそれを見てうれしいです。 – theChrisKent

+0

既に完了しました。ご協力いただきありがとうございます。 –