2013-05-24 4 views
0

SQL Noob здесь. Моя таблица выглядит так:PHP/MySQL - объединение двух таблиц в массив

Главная таблица

+-----------+-------------+ 
| talent_id | talent_name | 
+-----------+-------------+ 
|   1 | Talent1  | 
|   2 | Talent2  | 
|   3 | Talent3  | 
+-----------+-------------+ 

Образование Таблица

+-----------+-----------+-----------------------------+ 
| talent_id | level |   course   | 
+-----------+-----------+-----------------------------+ 
|   1 | Post-Grad | Master in Something   | 
|   1 | Post-Grad | Doctor in Something   | 
|   1 | College | BS Something Engineering | 
|   2 | College | BS Something Science  | 
|   2 | Post-Grad | Master in Something Science | 
|   3 | College | BS Computer Something  | 
+-----------+-----------+-----------------------------+ 

Можно ли объединить столбцы из двух таблиц в одном запросе? Я пробовал иметь отдельные запросы (которые, кстати, работали), но мне сложно совмещать эти два в массиве. И если только в том случае, имеющие отдельные запросы является лучшим решением, может вы, ребята, дайте мне идею как перебирать результатов двух массивов и объединить его в нечто вроде этого:

Array([0] => Array(
      'talent_id' => '1', 
      'talent_name' => 'Talent1', 
      'course' => Array('Master in something', 'Doctor in something', 'BS Something')), 
     [1] => Array('talent_id' => '2', ...)) 

Stack Overflow был большой помогите мне с начала моей стажировки. И я хочу поблагодарить всех вас за это.

+0

Попробуйте делать в LEFT JOIN: http://dev.mysql.com/doc/refman/5.0/en/join.html – jtheman

ответ

0

Во-первых, вы выбираете свои таланты (индексированные по их идентификатору) и свое образование. Здесь я рассмотрю, что вы только что сделали 2 запроса. Тогда

foreach ($educations as $education) { 
    $talents[$talent_id]['course'][] = $education; 
} 

Вы также можете сделать это с LEFT JOIN, но этот вид гидратация получает грязный очень быстро, когда у вас есть несколько уровней, и я бы не рекомендовал его.

+0

Спасибо! Это решает мою проблему! Я также тестировал заявления о соединении, предложенные другими ответами здесь. «FULL OUTER JOIN» работает, но столбцы на главной таблице повторяются в зависимости от того, сколько записей в образовании имеет талант. Я выбрал это, потому что это самый простой подход к проблеме. Еще раз спасибо! –

0

Есть много вариантов

Я часто использую:

SELECT talent.talent_id, talent.talent_name, education.course FROM talent, education WHERE education.talent_id = education.course 

крушению, если образование пусто талант талант не магазины вверх. Тогда вам нужно использовать join

3

Вы должны использовать левое соединение в запросе:

SELECT m.talent_id,m.talent_name,e.level,e.course 
FROM main AS m 
LEFT JOIN education AS e ON m.talent_id = e.talent_id 
+0

Это тоже работает! Благодаря! –

+0

На самом деле я разрывается между этим и решением 'foreach', так как оба дают тот же результат. –

+0

Ну, это будет зависеть от ваших предпочтений и потребностей. Я лично предпочитаю делать соединения в базе данных, потому что я нахожу его более чистым, и он использует меньше ресурсов. Теперь, в зависимости от остальной части кода, это может быть не самое лучшее. Если вам нужно повторно использовать свои отдельные массивы позже в коде, может быть полезно использовать foreach. Если вам нужна только эта объединенная таблица, я бы объективно сказал, что считаю, что мой ответ лучше ... –

0

Вы обычно используют объединение,

select * from main left join education using (talentid) 
0

Вы можете использовать FULL OUTER JOIN для достижения что. FULL OUTER JOIN объединяет результаты как левого, так и правого внешних соединений и возвращает все (сопоставленные или несогласованные) строки из таблиц по обе стороны таблицы.

SELECT [COL-1], [COL-2] [, ... COL-N] 
FROM [TABLE-1] 
FULL OUTER JOIN [TABLE-2] ON [TABLE-1].[COLUMN NAME 1] = [TABLE 2].[COLUMN NAME 2] 
Смежные вопросы