我希望有人能够就我创建的数据库架构和我用来查询数据库的SELECT语句提供一些建议。
我正在尝试创建一个包含1800年以来非常旧的报纸文章的数据库,存储文章的日期,标题和全文,文章的图像,报纸的名称等。文章来自文章中提到的地点名称和文章中提到的个人。
基本上下面是我创建的当前结构,其中tbArticle是主要的表格焦点(" test"是数据库的名称)。我已将报纸名称,图片信息,位置信息和个人标准化为自己的表格,因为假设有很多文章给很多人,我添加了一个链接表(lktbArticleIndividuals)在tbArticle& amp; tbIndividual;
创建数据库的原因显然是使一组有针对性的报纸文章可以搜索并以逻辑格式存储。
我的问题或疑问是......
我想要做的就是显示数据库中所有文章的列表,显然包括来自tbArticle以外的其他表的数据,并且这样做我正在使用这个SELECT查询;
SELECT *
FROM tbArticle a
, tbLocation l
, tbNewspapers n
, tbIndividual i
, lktbArticleIndividuals ai
, tbImage m
WHERE a.idLocation = l.idLocation
and a.idNewspaper = n.idNewspaper
and a.idArticle = ai.idArticle
and ai.idIndividual = i.idIndividual
and a.idImage = m.idImage;
我想要的是什么......除了...如果一篇文章中列出了多个人,则返回整篇文章的两个(或更多)实例,唯一的区别是不同的个人&# 39;显示的名字。
如果可能的话,我想列出每篇文章ONCE,但是要遍历两个或更多个人来包含它们。可以这样做吗?
如果我用PHP来查询数据库,我怀疑我可能要做的是循环中的某种循环来实现我想要的结果,但这对我来说似乎并不高效!
这对任何人都有意义吗?!
答案 0 :(得分:1)
您可以命名您感兴趣的列,而不是SELECT *
,而对于个人等内容,请使用GROUP_CONCAT()
将它们全部添加到一个字段中,并在结尾处您的查询,使用GROUP BY a.idArticle
将每篇文章限制为每篇文章一行。
答案 1 :(得分:0)
假设您只想要每个人的first_name,您可以使用GROUP_CONCAT组。
SELECT *,
GROUP_CONCAT(i.firstname)
FROM tbArticle a
, tbLocation l
, tbNewspapers n
, tbIndividual i
, lktbArticleIndividuals ai
, tbImage m
WHERE a.idLocation = l.idLocation
and a.idNewspaper = n.idNewspaper
and a.idArticle = ai.idArticle
and ai.idIndividual = i.idIndividual
and a.idImage = m.idImage;
GROUP BY a.idArticle
但是,如果你想获得每个人的许多细节,我会鼓励你做两个单独的查询:一个用于文章,另一个用于获取每篇文章的个人。