内部加入PHP

时间:2015-07-26 05:50:00

标签: php mysql join

我查看了之前提出的几个不同的问题,但它们比我现在需要的更先进。我需要一种简单的方法来连接两个表并显示结果,这样一旦我按照我需要的方式收集数据,我就可以以任何方式操作它们。下面的代码非常简单......但我遇到了麻烦。首先,我创建一个连接到数据库的类,然后创建了一个查询数据库并基于公共列连接到表的方法。在此之后,我希望循环可以根据他们的标题名称查看前四个结果,这些结果是' 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();
    }
}

2 个答案:

答案 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 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 :(得分: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