5

私はこのような3つのテーブルを持っています:

人物テーブル:

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_Addressテーブル:

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

ここで、Person_Addressテーブルのすべてのレコードだけでなく、次のような個人と住所のレコードも1つのクエリで取得したいと思います。

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を使用することはどのように可能ですか?ありがとう

4

2 に答える 2

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
于 2010-03-01T20:04:51.240 に答える
0

上記を実行するSQLを探しているのか、Zendの機能を使用してコーディングしているのかはわかりません。タグに「sql」と「joins」が含まれている場合、必要な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

Person_Addressは、PersonとAddressの間に多対多の関係があることを示していることに注意してください。多くの人が住所を共有する場合があり、人が複数の住所を持っている場合があります。

上記のSQLは、そのようなすべての関係を示します。したがって、Naveedに2つのAddressレコードがある場合、person_id=1の結果セットに2つの行があります。

于 2010-03-01T10:52:43.193 に答える