【问题标题】:Select multiple values as an array in MySQL在 MySQL 中选择多个值作为数组
【发布时间】:2015-12-07 16:02:12
【问题描述】:

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

论文(paperId,标题) 作者(authorId, authorName) Paper_Author(paperId, authorId)

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

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

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

如果是YES,那怎么办?到目前为止,我只是想尝试从 MySQL 中获取一组作者。

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

编辑 - 回应 Justin E 的评论:

我想要这样的东西:

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

【问题讨论】:

  • 当您的结果集中有多本书时,这将很难实现。我提供的答案允许您在一个简单的 foreach 循环中获得书名,其中包含一组作者。
  • 那么@Blag 的回答会起作用吗?

标签: mysql sql


【解决方案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 |

【讨论】:

  • 我会得到什么?是这样的吗?标题:“ABC”,作者:{“Ken”,“Kitty”}
  • @ChungLunYuen 是的,你会得到一个由, 分隔的列表:Ken,Kitty或者你作为 2param 传递的内容
  • 哦!这正是我需要的!谢谢! ^^
【解决方案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'
    )
);

【讨论】:

  • 使用 PDO 代码更新的示例将生成一个以书名为键的数组,其中每个标题的多个子元素代表一个作者。
  • 我还编辑了我的问题以指定我需要什么。
猜你喜欢
  • 2015-05-23
  • 1970-01-01
  • 2021-05-19
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 2021-09-28
相关资源
最近更新 更多