数据库表关系问题

时间:2010-11-18 19:43:26

标签: mysql join

情况: 我收到了消息。新闻发布在多个类别中。

问题: 如何存储新闻和类别之间的关系?我应该创建三个表(新闻,类别,news_categories)吗?这是最好的方法吗?

让我们看看例子: 我想查询数据库的最新消息,所以我需要: 1.使用连接查询新闻以查询新闻类别 2.在循环中,查询以获取类别名称。

所以,我有10个新闻(10个查询)X个类别=总查询数量。不是太多了?

更新
这是我的例子。有以下三个表格。

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

有人有任何建议如何解决这个问题吗?

此致 微米。

1 个答案:

答案 0 :(得分: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

你可以简化它,如果你已经知道了CategoryID,你可能会从下拉列表中找到它,那么加入类别表是不必要的,你可以这样写:

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子句。