我检查了以前问过的几个不同的问题,但它们比我目前所需要的更先进。我需要一种简单的方法来连接两个表并显示结果,这样我就可以用我想要的任何方式操作它们,一旦它按照我需要的方式收集数据。下面的代码很简单。但我现在有麻烦了。首先创建一个连接到数据库的类,然后创建一个基于公共列查询数据库和连接到表的方法。在此之后,我希望循环根据它们的标题名称,即“黄金”、“白金”、“白金”、“钯”来查看前四名,我只想确保连接请求是有效的。请查看下面的代码,也许您可以告诉我为什么我一直得到的结果是1 Gold 1 Gold
当我需要一个包含所有4种贵金属的列表时,我会得到4次黄金。我想,当when循环通过时,我会得到每个循环,因为它应该贯穿所有4行,现在还没有更多的元素在第1行运行,每次返回1 Gold。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();
}
}发布于 2015-07-26 06:01:57
在这里,你根本没有理由加入价格表。
SELECT metal.id, metal.title
FROM metal
ORDER BY metal.title因为你没有从那里得到任何结果。如果你真的需要加入价格,并以“不重复”的金属名称显示结果,你应该只是分组结果。
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)可以被理解为“有价格的金属”
发布于 2015-07-26 06:14:33
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 4https://stackoverflow.com/questions/31634097
复制相似问题