База данных для возврата многомерного результата - PullRequest
2 голосов
/ 27 января 2010

Это дополнительный вопрос к моему предыдущему .
Ситуация:

Table 1:
+--------------------+--------------------+
|               v_id |             v_name |
+--------------------+--------------------+
|                  1 |            v_name1 |
+--------------------+--------------------+
| etc...

Table 2:
+--------------------+--------------------+
|               a_id |             a_name |
+--------------------+--------------------+
|                  1 |            a_name1 |
+--------------------+--------------------+
| etc...

Table 3:
+--------------------+--------------------+
|               v_id |               a_id |
+--------------------+--------------------+
|                  1 |                  1 |
+--------------------+--------------------+
|                  1 |                  2 |
+--------------------+--------------------+
|                  1 |                  3 |
+--------------------+--------------------+

Я хочу объединить две таблицы:

SELECT t1.*, t2.a_name
FROM `table1` t1
LEFT JOIN `table_3` t3 ON t3.v_id = t1.v_id
LEFT JOIN `table_2` t2 ON t2.a_id = t3.a_id
WHERE t1.id = 1;

Результатом этого запроса будет 3 строки для заданных таблиц, каждая строка с одинаковыми значениями из Table 1, просто разные a_name из Table 3.
Теперь возможномне сделать a_name массив (из 3 ячеек в данном случае)?Я думаю, что это невозможно.Если это не так, как бы мне построить запрос так, чтобы он возвращал только одну строку с результатами a_name, соединенными с заданной «клейкой» строкой?1020 * Если бы я получил результат в PHP, я бы ожидал что-то вроде:

$result = array(
    'v_id'    => 1,
    'a_name'  => array('a_name1', 'a_name2', 'a_name3')
);

или

$result = array(
    'v_id'    => 1,
    'a_name'  =>'a_name1, a_name2, a_name3'), # assuming I used ', ' as the glue string
);

Ответы [ 2 ]

2 голосов
/ 27 января 2010

Использование:

    SELECT t1.*, 
           GROUP_CONCAT(DISTINCT t2.a_name SEPARATOR ',')
     FROM `table1` t1
LEFT JOIN `table_3` t3 ON t3.v_id = t1.v_id
LEFT JOIN `table_2` t2 ON t2.a_id = t3.a_id
   WHERE t1.id = 1
 GROUP BY [list of t1 columns here]
Ответ

Sean Viera работает, как вы указали, из-за предложения WHERE, а также потому, что MySQL позволяет исключать столбцы из GROUP BY. Это нехорошая привычка - это допускает только MySQL, и такие запросы не будут портироваться на другие базы данных (на SO много примеров).

Я добавил отличительные в GROUP_CONCAT - не думал, что вам нужны дубликаты, если таковые имеются.

1 голос
/ 27 января 2010

Я полагаю, вы ищете функцию GROUP_CONCAT.

В вашем запросе это будет выглядеть так:

SELECT t1.*, GROUP_CONCAT(t2.a_name SEPARATOR ',')
FROM `table1` t1
LEFT JOIN `table_3` t3 ON t3.v_id = t1.v_id
LEFT JOIN `table_2` t2 ON t2.a_id = t3.a_id
WHERE t1.id = 1
GROUP BY [list of t1 columns here] 
-- update thanks to OMG Ponies.
...