代码之家  ›  专栏  ›  技术社区  ›  Naveed

Zend框架:如何使用join在一个查询中组合三个表?

  •  5
  • Naveed  · 技术社区  · 14 年前

    我有三张这样的桌子:

    人员表:

    person_id |    name     |   dob
    --------------------------------
        1     |   Naveed    |  1988
        2     |   Ali       |  1985
        3     |   Khan      |  1987
        4     |   Rizwan    |  1984
    

    地址表:

    address_id |  street  |   city  |  state  | country
    ----------------------------------------------------
       1       | MAJ Road | Karachi |  Sindh  | Pakistan
       2       | ABC Road | Multan  |  Punjab | Pakistan
       3       | XYZ Road | Riyadh  |    SA   | SA
    

    个人地址表:

    person_id | address_id
    ----------------------
       1      |     1
       2      |     2
       3      |     3
    

    现在,我想通过一个查询获得人员地址表的所有记录,以及他们的人员和地址记录:

    person_id|    name  |  dob  | address_id |  street  |   city  |  state  | country
    ----------------------------------------------------------------------------------
        1    |   Naveed |  1988 |    1       | MAJ Road | Karachi |  Sindh  | Pakistan
        2    |   Ali    |  1985 |    2       | ABC Road | Multan  |  Punjab | Pakistan 
        3    |   Khan   |  1987 |    3       | XYZ Road | Riyadh  |    SA   | SA
    

    如何使用Zend?谢谢

    2 回复  |  直到 13 年前
        1
  •  14
  •   David Snabel-Caunt    14 年前

    参考指南是了解 Zend_Db_Select . 当然,还有下面的例子:

    //$db is an instance of Zend_Db_Adapter_Abstract
    $select = $db->select();
    $select->from(array('p' => 'person'), array('person_id', 'name', 'dob'))
           ->join(array('pa' => 'Person_Address'), 'pa.person_id = p.person_id', array())
           ->join(array('a' => 'Address'), 'a.address_id = pa.address_id', array('address_id', 'street', 'city', 'state', 'country'));
    

    然后像这样简单地获取一行:

    $db->fetchRow($select);
    

    在调试zend_db_select时,您可以使用一个巧妙的技巧-简单地打印select对象,然后调用toString方法生成SQL:

    echo $select; //prints SQL
    
        2
  •  0
  •   Frank Shearar    14 年前

    我不确定您是在寻找SQL来完成上面的工作,还是使用Zend的工具来编写代码。考虑到标签中存在“sql”和“join”,下面是您需要的sql:

    SELECT p.person_id, p.name, p.dob, a.address_id, street, city, state, country
    FROM person p
    INNER JOIN Person_Address pa ON pa.person_id = p.person_id
    INNER JOIN Address a ON a.address_id = pa.address_id
    

    记住这个人的地址告诉我们,一个人和一个地址之间有一种多对多的关系。许多人可以共享一个地址,一个人可以有多个地址。

    上面的SQL将显示所有这些关系。因此,如果naveed有两个地址记录,那么在person_id=1的结果集中会有两行。