PHP SQL - 从两个表中有效地选择数据

时间:2016-05-24 08:06:51

标签: php sql

我们说我有这两个表: Example Tables

在PHP中,我想创建一个名为' Foo '的对象。其中包含TagName,Display和分配给该标记名的数字数组。

如果我要查询tagName' bar'我会得到一个显示' Bar Foo Ipsum'和数字33和545。

目前我这样做:

$stmt = $db->prepare("SELECT * FROM DetailsTable");
$stmt->execute();
$details = $stmt->fetchAll();
$stmt = $db->prepare("SELECT * FROM NumbersTable");
$stmt->execute();
$numbers = $stmt->fetchAll();
$myObjects = array();
foreach($details as $detail){
   $foo = new Foo($detail['TagName'], $detail['Display']);
   foreach($numbers as $number){
       if($number['TagName'] == $detail['TagName']){
           $foo.appendNumber($number['Numbers']);
       }
   }
   array_push($myObjects, $foo);
}

class Foo {
   private $tag, $display;
   private $numbers = array();

   public function __construct($tag, $display){
       $this->tag = $tag;
       $this->display = $display;
   }

   /** Insert getters and setters  */
   public function appendNumber($n){
       array_push($this->numbers, $n);
   }
}

上面的代码是伪代码所以我还没编码,但它是我最有可能编写的代码。我想首先问一下这个问题。

基本上,对象Foo应该具有TagName和DisplayName以及一个数字在不同表中的数组。 TagName在DetailsTable中是唯一的。

TL; DR :从DetailsTable获取详细信息以及NumbersTable中与其关联的数字并将其放入对象中。

2 个答案:

答案 0 :(得分:1)

我认为你可以通过左连接来解决这个问题

这样的事可能吗?

SELECT * FROM NumbersTable LEFT JOIN DetailsTable ON NumbersTable.TagName = DetailsTable.TagName

答案 1 :(得分:1)

你应该让SQL引擎完成匹配两个表中记录的工作,这是它擅长的地方。

您的代码看起来会像这样:

$stmt = $db->prepare("SELECT    d.TagName, d.Display, n.Numbers 
                      FROM      DetailsTable d
                      LEFT JOIN NumbersTable n
                             ON n.TagName = d.TagName");
$stmt->execute();
$currentTag = "";
foreach ($stmt->fetchAll() as $record) {
    if ($record['TagName'] !== $currentTag) {
        $myObjects[] = $foo = new Foo($currentTag = $record['TagName'], $record['Display']);
    }
    $foo.appendNumber($record['Numbers']);
}