首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP内部连接

PHP内部连接
EN

Stack Overflow用户
提问于 2015-07-26 05:50:00
回答 2查看 5K关注 0票数 1

我检查了以前问过的几个不同的问题,但它们比我目前所需要的更先进。我需要一种简单的方法来连接两个表并显示结果,这样我就可以用我想要的任何方式操作它们,一旦它按照我需要的方式收集数据。下面的代码很简单。但我现在有麻烦了。首先创建一个连接到数据库的类,然后创建一个基于公共列查询数据库和连接到表的方法。在此之后,我希望循环根据它们的标题名称,即“黄金”、“白金”、“白金”、“钯”来查看前四名,我只想确保连接请求是有效的。请查看下面的代码,也许您可以告诉我为什么我一直得到的结果是1 Gold 1 Gold

当我需要一个包含所有4种贵金属的列表时,我会得到4次黄金。我想,当when循环通过时,我会得到每个循环,因为它应该贯穿所有4行,现在还没有更多的元素在第1行运行,每次返回1 Gold。id和金属的标题名称都是。如果我遗漏了什么东西,请随便问,如果有帮助的话,我会帮你添加的。

代码语言:javascript
复制
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();
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-26 06:01:57

在这里,你根本没有理由加入价格表。

代码语言:javascript
复制
SELECT metal.id, metal.title
FROM metal 
ORDER BY metal.title

因为你没有从那里得到任何结果。如果你真的需要加入价格,并以“不重复”的金属名称显示结果,你应该只是分组结果。

代码语言:javascript
复制
SELECT metal.id, metal.title
FROM metal 
INNER JOIN price ON (metal.id = price.metalId) 
GROUP BY metal.id
ORDER BY metal.title

之后,您可以从价格表中检索一些有用的数据,例如每种金属的平均价格。

代码语言:javascript
复制
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 JOININNER JOIN之间的区别。

LEFT -将从第一个表(金属)中获取所有需要的行,并从第二个表(价格)中添加结果,即使价格表中没有这样的金属(那么第二个表的结果将为NULL)。(metal.id = price.metalId)可以被理解为“所有有价格的金属,如果有的话”。

INNER -将只从第一个表中提取那些行,这些行以"JOIN ON“条件显示在第二个表中。(metal.id = price.metalId)可以被理解为“有价格的金属”

https://pp.vk.me/c623725/v623725696/14ae4/459rNGJwMJc.jpg

票数 1
EN

Stack Overflow用户

发布于 2015-07-26 06:14:33

JOIN在两个表中创建匹配行的交叉乘积。如果每个price有多个metal行,那么您将得到所有这些不同的价格,然后您将得到其中的前4行。

如果要限制金属的数量,但不限制行总数,则可以使用子查询连接:

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31634097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档