2010-11-18 5 views
1

상황 : 뉴스가 있습니다. NEws는 여러 카테고리에 게시됩니다.데이터베이스 테이블 관계 문제

문제 : 뉴스와 카테고리 간의 관계를 저장하는 방법은 무엇입니까? 3 개의 테이블 (뉴스, 카테고리, 뉴스 _ 카테고리)을 생성해야합니까? 이것이 가능한 최선의 방법입니까?

의이 예를 보자 : 나는 최신 뉴스에 대한 데이터베이스를 조회 할, 그래서 필요 : 범주 이름을 얻을 뉴스 카테고리 루프에서 2. 쿼리에 대한 쿼리에 가입하여 뉴스 1. 쿼리를.

따라서 10 개의 뉴스 (10 개 검색어) X 개의 카테고리 = 총 검색어 수입니다. 너무 많이하지?

업데이트
여기가 저의 예입니다. 다음 세 개의 테이블이 있습니다.

-- news -- 
ID 
Title 

-- categories -- 
ID 
Name 

-- news_categories -- 
ID  
NewsID 
CategoryID 

내가 사용하는 쿼리와 상관없이 모든 프로젝트 및 프로젝트 범주 이름을 올바르게 반환하지만 프로젝트는 범주의 양에 따라 몇 번 표시됩니다. 어쩌면 너무 피곤하거나 어떨지 모르지만 실제로 어떤 해결책을 발견 할 수는 없습니다.

업데이트 2 여기에
의 내 쿼리 :

Title Name 
Test PHP 
Test2 MySQL 
Test2 CSS 

누구가 어떻게 문제를 해결하기 위해 어떤 제안이 있습니다

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 

여기 그 결과입니까?

감사합니다, M.

답변

0

예 세 개의 테이블은 뉴스 및 newscategory 및 카테고리와 newscategory 사이의 외래 키와 정확한 된 구현입니다.

넌 쿼리는 다음과 같은 특정 카테고리 이름에 대한 모든 뉴스 제목을 반환 할 수 있습니다 : 당신은 이미 카테고리 ID를 알고 있다면

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 코드는 로직에 도움이 필요하지만, 실제 구현은 당신에게 달려 :

SELECT Title, fnCategoryList(ID) AS Categories 
    FROM news 

의 수에 따라 다음과 같을 것이다 위의 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 

귀하의 뉴스 테이블에 기록이 쿼리가 잘 수행되지 않습니다. 거의 모든 쿼리에서 WHERE 절을 사용해야합니다.

+0

귀하의 대답은 정확하다고 생각하지만, 구현에 문제가 있습니다.나는 나의 질문을 편집했다, 당신은 매우 멋지게 보이고, 보일 것이냐? –

+0

샘플 테이블과 일치하도록 위의 예제 쿼리를 업데이트했습니다. 아마 당신이 가진 문제를 오해하고 있습니까? 테이블 사이에 외래 키가 있습니까? news_categories 테이블 (동일한 뉴스 ID 및 동일한 categoryID 여러 번)에 중복이 있습니까? 작동하지 않는 쿼리를 게시하면 기꺼이 살펴볼 것입니다. – theChrisKent

+0

이미 완료되었습니다. 도움을 주셔서 감사합니다. –