情况: 我得到消息了。新闻发布在多个类别中。
问题: 如何存储新闻和类别之间的关系?我应该创建三个表(新闻、类别、新闻类别)吗?这是可能的最佳方法吗?
让我们看例子: 我想查询数据库的最新消息,所以我需要: 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/