所以这是例子: 我有一个数据库与"艺术家"和#34;画作"。我需要创建一个包含艺术家信息的页面(我从URL中获取艺术家ID)以及与该艺术家相关的每一幅画作,我都有表格链接。
有没有办法只用一条语句来做这个请求?
我试过了:
SELECT *
FROM artiste, toile
WHERE artiste_id = {$id} AND
fk_artiste_id = artiste_id
它有效,但由于我使用了一段时间来获取数据,我获得了艺术家信息的3倍(因为有3幅与该艺术家相关的绘画),如果我做了一个GROUP通过artiste_id,我只得到1位艺术家,而且它是第一幅画,而不是全部。
感谢您的时间! (原谅我可怜的英语)。
答案 0 :(得分:4)
你得到的结果实际上很安静。您实际上是从给定的艺术家那里获取所有绘画,并将艺术家的信息添加到每幅画中。你可以考虑做两个查询,一个用于艺术家信息,一个用于绘画。或者您可以保留查询并确保在循环之前输出艺术家信息,然后在循环内输出绘画信息,只需跳过附加到其上的艺术家信息。
答案 1 :(得分:2)
如果您只需要有关绘画的信息,您可以仅查询该表的信息。
SELECT
toile.*
FROM
artiste, toile
WHERE
artiste.artiste_id = {$id} AND
toile.fk_artiste_id = artiste.artiste_id
如果这与MySQL不完全兼容,我很抱歉,我最近一直在使用MS SQL。
编辑:另一种方法是使用INNER JOIN
。再说一次,如果有人可以纠正错误的确切语法,那么它应该是这样的:
SELECT
toile.*
FROM
toile INNER JOIN artiste ON artiste.artiste_id = toile.fk_artiste_id
WHERE
artiste.artiste_id = {$id}
这两个部分都需要在单独的查询中。如果您愿意,每个要检索的数据集或每个问题都需要一个查询。如果问题是“我对艺术家X的数据是什么?”然后你应该回答这个问题。如果你的问题是“我拥有哪些图像是艺术家X的画作?”那么这是另一个应该用另一个问题处理的问题。
答案 2 :(得分:1)
只做两个查询。
使用SQL,信息以表格格式返回,因此您无法在单个查询中获得艺术家及其所有绘画的一个副本。
另外,我注意到你使用{$ id},标签说PHP,所以我必须推荐prepared statements来帮助你的应用程序的安全性和可维护性。不要乱用SQL Injection漏洞(和漏洞)。
获取艺术家的大量副本可能实际上更快,但这纯粹是一种性能优化。如果你担心表现,我最好的建议是不要担心表现。