假设我有以下架构,并且为了您的信息,我正在使用MySQL:
纸(paperId,title) 作者(authorId,authorName) Paper_Author(paperId,authorId)
我设计这样的表格是因为一篇论文可能有多个作者而作者可能会写一篇以上的论文。
我现在想获得一篇论文的标题和所有作者。
我一直想知道我是否可以在一个声明中做到这一点?
如果是,那怎么样?到目前为止,我只是试图从MySQL获得一系列作者。
如果是NO,我怎样才能保持交易的原子性? (让我们考虑将标题和作者作为一个交易)
编辑 - 回应Justin E的评论:
我想得到这样的东西:
array(
"title" => "ABC"
"authors" => array("Ken", "Kitty", "Keith")
)
答案 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()
)
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 |