Как в Mysql получить массив в одном из полей?

Добрый день.

Может я конечно хочу многое от MySQL, но хотелось бы получить массив в одном из полей.
Сейчас я по id книги получаю её авторов через запятую:

SELECT 
    GROUP_CONCAT(DISTINCT `a`.`title` ORDER BY `a`.`title` ASC SEPARATOR ", ") AS `title`, 
    `b`.* 
FROM `book` as `b` 
    LEFT OUTER JOIN `book_author` AS `ba` ON (`b`.`id` = `ba`.`book_id`)
    LEFT OUTER JOIN `author` AS `a` ON (`ba`.`author_id` = `a`.`id`)
WHERE `b`.`id` = 4
    GROUP BY `b`.`id`

`title` | `id` | `name`
--------------------------
A1, A2 | 4 | Book1

А хотелось бы массив:

`title` | `id` | `name`
--------------------------------------------------------------
[[id = 1, title = A1], [id = 2,title = A2]] | 4 | Book1
  • Вопрос задан
  • 12434 просмотра
Решения вопроса 2
leoismyname
@leoismyname
Я бы предложил:
GROUP_CONCAT(a.`id`, ',', a.`title` SEPARATOR ';')
На выходе получим:
1,A1;2,A2;3,A3
Ответ написан
dev.mysql.com/doc/refman/5.0/en/data-type-overview.html

Как видите, массивов тут нет.
Так что либо делайте собственную реализацию (сериализуйте, как подсказал @VitaZheltyakov), либо так как вы уже сделали - с нормализацией базы данных.
Однако отмечу, что есть nosql-БД, которые будут поддерживать такой функционал из коробки, например mongodb. Однако это другой подход к архитектуре БД и работой с ней.
Выбирайте :-)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Не изобретайте велосипед - серелизуйте массив и записывайте. А ещё лучше сохраняйте массив в файл или memcache
Ответ написан
например:
table `book`
| id | title|  name |
|  1 | A1   | book1 |

запрос:
SELECT CONCAT_WS('::', FORMAT(`id`,0),`title`,`name`) as `bookArray` FROM `book` 
WHERE`id` =1

получим-
| bookArray    |
| 1::A1::book1 |

CONCAT_WS - это объединение с разделителем (например "::");
CONCAT -просто объединение;
FORMAT( `id` , 0 ) -привести поле int в string;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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