Платформа зенда: Как объединить три таблицы в одном запросе с помощью Соединений?

У меня есть три таблицы как это:

Таблица Person:

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, но также и с их личностью и записями адреса как это одним запросом:

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

Как это - возможный пехлеви использования?Спасибо

5
задан David Snabel-Caunt 1 March 2010 в 20:30
поделиться

2 ответа

Справочное руководство является лучшей отправной точкой для изучения 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
14
ответ дан 18 December 2019 в 13:13
поделиться

Я не уверен, ищете ли вы 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 говорит нам, что между персоной и адресом существует отношение "многие ко многим". Многие лица могут иметь один адрес, а у одного лица может быть более одного адреса.

SQL выше покажет ВСЕ такие отношения. Таким образом, если у Навида есть две записи об адресах, в наборе результатов будет две строки с person_id = 1.

0
ответ дан 18 December 2019 в 13:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: