SQL查询一对多关系

时间:2012-05-22 14:19:13

标签: php select one-to-many

我有两个表,表A和表B.对于表A中的每个记录,表B中有许多记录;因此,表A和B之间存在一对多关系。我想执行一个查询,以便对于从表A返回的每一行,所有相应的行都将从表B返回。据我所知,我需要使用INNER Join - 但是,如何通过PHP来访问所有返回的行?

$sql = "Select A.ID, B.Name * From A INNER JOIN B ON A.ID = B.ID";
A.ID  |  B.fName        |  B.lName
1          nameone         lnameone
1          nametwo         lnametwo
2          namethree       lnamethree
4          namefour        lnamefour

现在我已经得到了上述结果,我想使用PHP一次只为一个B.Name循环遍历A.ID的所有值。所以,我想要的结果如下:

1.
nameOne lNameOne
nameTwo lnametwo

2. namethree lNamethree

4. nameFour lNameFour

基本上,我正在尝试按表A中的ID对查询结果进行分组。

我非常感谢你的帮助!

谢谢,

埃文

2 个答案:

答案 0 :(得分:0)

你可以只谷歌“php从数据库中获取”,并使用一些正常的数组预处理,但我担心你发现的建议可能并不理想。这就是我要做的事情:

$pdo = new PDO('mysql:host=host;dbname=dbname', 'user', 'pass');
$result = $pdo->query(<<<SQL
   SELECT
      ID,
      Name
   FROM
      A
      -- Alternative to `JOIN B USING(ID)` or `JOIN B ON (A.ID = B.ID)
      NATURAL JOIN B
SQL
);
$a = array();
while ($row = $result->fetch()) {
   if (!isset($a[$row['ID']]) {
      $a[$row['ID']] = array();
   }
   $a[$row['ID']][] = $row['Name'];
}

您稍后还可以GROUP BY IDGROUP_CONCAT名称为explode,以便跳过手动数组创建并减少一些迭代(尽管SQL将会在这种情况下做更多的事情)。

答案 1 :(得分:0)

在SQL查询中添加一个简单的ORDER BY A.ID可能会让您将这些项目“分组”在一起。如果不确切地知道你想对“群体”做什么,就很难给出更详细的答案。