我查看了之前提出的几个不同的问题,但它们比我现在需要的更先进。我需要一种简单的方法来连接两个表并显示结果,这样一旦我按照我需要的方式收集数据,我就可以以任何方式操作它们。下面的代码非常简单......但我遇到了麻烦。首先,我创建一个连接到数据库的类,然后创建了一个查询数据库并基于公共列连接到表的方法。在此之后,我希望循环可以根据他们的标题名称查看前四个结果,这些结果是' gold',' silver'' platinum',&# 39;钯'我只是想确保加入请求正常。请查看下面的代码,也许你可以告诉我为什么我一直得到的结果 1金 1金 1金 1金
字面意思当我需要所有4种贵金属的清单时,我得到了4次黄金。我认为当while循环运行时我会得到每一个,因为它应该贯穿所有4行而且还没有它贯穿相同的第一排,每次都带回1金。 id和金属标题都是名称。如果我遗失了一些东西,请随意提出,如果有帮助我会为你添加。
class testJoin{
public function __construct($dbCon){
$this->dbConnection = $dbCon;
}
function testingJoin($dbCon) {
if($results = $this->dbConnection->query("SELECT metal.id, metal.title, price.metalId FROM metal INNER JOIN price ON metal.id = price.metalId ORDER BY metal.title LIMIT 0,4")){
while($data = $results->fetch_assoc()){
printf("<p style=\"display:inline;\">%s</p>
<p style=\"display:inline;\">%s</p><br />", $data['id'], $data['title']);
}
}
$dbCon->close();
}
}
答案 0 :(得分:1)
此处您没有理由加入价格表
SELECT metal.id, metal.title
FROM metal
ORDER BY metal.title
因为那里没有任何结果。 如果你真的需要加入价格并通过“不重复”的金属名称显示结果,你应该只是GROUP结果
SELECT metal.id, metal.title
FROM metal
INNER JOIN price ON (metal.id = price.metalId)
GROUP BY metal.id
ORDER BY metal.title
之后,您可以从价格表中检索一些有用的数据,例如每种金属的平均价格
SELECT metal.id, metal.title, AVG(price.price) AS metal_price
FROM metal
INNER JOIN price ON (metal.id = price.metalId)
GROUP BY metal.id
ORDER BY metal.title
另外,您应该了解LEFT JOIN
和INNER JOIN
之间的区别。
LEFT
- 将从第一个表(金属)获取所有需要的行,并添加第二个(价格)的结果,即使价格表中没有这样的金属(然后第二个表的结果将为NULL)。 (metal.id = price.metalId)
可以被描述为“所有具有某种价格的金属,如果有的话”
INNER
- 将仅通过“JOIN ON”条件从第一个表中获取第二个表中的那些行。 (metal.id = price.metalId)
可以被描述为“具有价格的那些金属”
答案 1 :(得分:1)
JOIN
创建两个表中匹配行的交叉积。如果每个price
有多个metal
行,您将获得所有这些不同的价格,然后您获取前4行。
如果要限制金属数量,而不是总行数,可以使用子查询加入:
SELECT metal.id, metal.title, price.metalId
FROM (SELECT id, title
FROM metal
ORDER BY title
LIMIT 4) AS metal
JOIN price ON metal.id = price.metalId
或者,如果您希望每个金属只获得一行,则可以使用GROUP BY
SELECT metal.id, metal.title, price.metalId
FROM metal
JOIN price ON metal.id = price.metalId
GROUP BY metal.id
ORDER BY metal.title
LIMIT 4