0

所以这里是一个例子:我有一个包含“艺术家”和“绘画”的数据库。我需要创建一个包含艺术家信息的页面(我从 URL 获取艺术家 ID)以及与该艺术家相关的每幅画,我都链接了两个表。

有没有办法只用一条语句来完成这个请求?

我试过这个:

SELECT * 
FROM artiste, toile 
WHERE artiste_id = {$id} AND 
      fk_artiste_id = artiste_id

它有效,但由于我使用一段时间来获取数据,我得到了艺术家信息的 3 倍(因为有 3 幅画与该艺术家相关联),如果我按艺术家 ID 分组,我只会得到 1 位艺术家和这是第一幅画,不是全部。

谢谢你的时间!(请原谅我糟糕的英语)。

4

3 回答 3

4

你得到的结果实际上是正常的。您实际上是从给定艺术家那里获取所有画作,并将艺术家的信息添加到每幅画中。您可以考虑进行两个查询,一个查询艺术家信息,一个查询绘画。或者您可以保留您的查询并确保在循环之前输出艺术家信息,然后在循环内输出绘画信息并跳过附加到它的艺术家信息。

于 2012-08-05T02:20:51.667 回答
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 的画作?” 那么这是另一个应该处理另一个查询的问题。

http://sqlfiddle.com/#!3/47ff0/2

于 2012-08-05T02:18:27.993 回答
1

只需执行两个查询。

使用 SQL,信息以表格格式返回,因此您将无法在单个查询中仅获得艺术家及其所有画作的一份副本。

另外,我注意到你使用了 {$id},并且标签上写着 PHP,所以我必须推荐准备好的语句来帮助你的应用程序的安全性和可维护性。不要乱用SQL 注入漏洞(和错误)。

获得大量艺术家的副本实际上可能会更快,但这纯粹是性能优化。如果您担心性能,我最好的建议是停止担心性能。

于 2012-08-05T02:31:04.973 回答