mysql - 数据库表关系问题

标签 mysql join

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

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

让我们看例子: 我想查询数据库的最新消息,所以我需要: 1.查询新闻使用join查询新闻分类 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

有人对如何解决该问题有任何建议吗?

问候,

最佳答案

是的,三个表是在新闻和新闻类别以及类别和新闻类别之间使用外键的正确实现。

您的查询可能是这样的,以返回特定类别名称的所有新闻标题:

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,您可以简化它,您可能会从下拉菜单或其他东西中知道,然后就不需要加入 Category 表,您可以这样写:

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

关于mysql - 数据库表关系问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4218839/

相关文章:

php - 如何控制用户在我的网站上的事件?

sql - 如果存在则有条件加入

mysql - 如何对这三个表进行适当的 OUTER JOIN?我不断得到最后一栏中的所有结果,加起来

MySQL 将 2 个查询连接到同一个表

MySQL:为什么我的查询无法完成?

MySQL滞后/领先功能?

mysql - SQL 的快速查询

mysql - 使用连接信息计数

SQL统计每个部门的不同工作

SQL从左表中获取左连接值