在MySQL中选择多个值作为数组

时间:2015-12-07 16:02:12

标签: mysql sql

假设我有以下架构,并且为了您的信息,我正在使用MySQL:

纸(paperId,title) 作者(authorId,authorName) Paper_Author(paperId,authorId)

我设计这样的表格是因为一篇论文可能有多个作者而作者可能会写一篇以上的论文。

我现在想获得一篇论文的标题和所有作者。

我一直想知道我是否可以在一个声明中做到这一点?

如果是,那怎么样?到目前为止,我只是试图从MySQL获得一系列作者。

如果是NO,我怎样才能保持交易的原子性? (让我们考虑将标题和作者作为一个交易)

编辑 - 回应Justin E的评论:

我想得到这样的东西:

array(
    "title" => "ABC"
    "authors" => array("Ken", "Kitty", "Keith")
)

2 个答案:

答案 0 :(得分:2)

SELECT paper.*, author.* FROM paper_author 
  LEFT JOIN paper USING(paperid)
  LEFT JOIN author USING(authorid)

您的数组将如下所示:

Array(
  0 => Array(
    'title' => 'This is a title',
    'authorname' => 'This is an Authors Name',
  )
);

$authors = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    $authors[$row['title']][] = $row['authorname'];
}

print_r($authors);

Array(
    'Book 1' => array(
         'John Smith',
         'Jane Doe'
    )
);

答案 1 :(得分:1)

MySQL GROUP_CONCAT()正是您所需要的(也许是PHP explode()

SQL Fiddle

MySQL 5.5架构设置

CREATE TABLE Paper (`paperId` int, `title` varchar(7));
INSERT INTO Paper (`paperId`, `title`)
VALUES (1, 'hello'),(2, 'hola'),(3, 'bonjour');

CREATE TABLE Author (`authorId` int, `authorName` varchar(3));
INSERT INTO Author (`authorId`, `authorName`)
VALUES (1, 'me'),(2, 'moi');

CREATE TABLE Paper_Author (`paperId` int, `authorId` int);
INSERT INTO Paper_Author (`paperId`, `authorId`)
VALUES (1, 1),(1, 2),(2, 2);

查询1

SELECT Paper.`title`, GROUP_CONCAT(Author.`authorName`) as `authors`
FROM Paper_Author
INNER JOIN Paper
  ON Paper.`paperId` = Paper_Author.`paperId`
INNER JOIN Author
  ON Author.`authorId` = Paper_Author.`authorId`
GROUP BY Paper.`title`

<强> Results

| title | authors |
|-------|---------|
| hello |  me,moi |
|  hola |     moi |