2015-10-19 2 views
0

У меня есть таблица А, содержащегоПолучение нескольких значений для того же строки

id | data 
1  10 
2  20 

и таблица В, содержащем

id | a_id | value 
1  1  abc 
2  1  def 
3  2  ghi 

столбец A_ID ссылок Таблица B на колонку с идентификатором таблицы А. Я должен получить в прошлом 4 строки данных из таблицы A вместе со своим соответствующим значением из таблицы B. Когда я попытался получить его с использованием этого запроса

SELECT * FROM tableA INNER JOIN tableB ON tableA.id = tableB.id ORDER BY tableA.id DESC LIMIT 4 

Я получил дубликат строки с идентификатором 1 из из таблицы А, как

id | data | value 
1  10  abc 
1  10  def 
2  20  ghi 

Есть ли способ, так что я могу уменьшить эти дубликаты данных, так что я могу получить одну строку с идентификатором 1 вместе с его двумя значениями?

+0

SELECT *, tableb.value - почему вы выбираете материал дважды – Strawberry

+1

да, вы можете это сделать, но это будет одна строка с разделителем. 'GROUP_CONCAT (tableB.value SEPERATOR ',') ... GROUP BY tableA.id' https://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat – cmorrissey

+0

Если вы изо всех сил пытаетесь использовать квадратные скобки, вы можете обернуть 'GROUP_CONCAT' с помощью' REPLACE() ':' REPLACE (GROUP_CONCAT (CONCAT ('[', tableB.value, ']')), ',', '') as val1' – JNevill

ответ

0

, пожалуйста, используйте этот запрос:

SELECT * FROM tableA INNER JOIN tableB ON tableA.id = tableB.id ORDER BY tableA.id DESC LIMIT 4 Group By tableA.id 
+2

Пожалуйста, объясните, почему это работает. –

0

Просто пост-процесс его в PHP, например:

$data = []; 
while ($row = $result->fetchAssoc()) { // or whatever you do to fetch your data 
    if (!isset($data[$row['id']])) { 
     $row['value'] = [$row['value']]; 
     $data[$row['id']] = $row; 
    } else { 
     $data[$row['id']]['value'][] = $row['value'] 
    } 
} 

Отличный результат:

[ 
    1 => [ 
     id => 1, 
     data => 10, 
     value => ['abc', 'def'] 
    ] 
    .. 
]