返回单个MySQL结果,其中包含一行中的多个值

时间:2011-11-21 19:13:21

标签: php mysql

我正在尝试用php进行简单的搜索查询:

SELECT * FROM `books` NATURAL JOIN `authors` WHERE `books`.`title` LIKE '%$search%

在返回的结果中,我希望相同的书名可以有多个作者。我想用多位作者只显示一次标题,并且似乎无法找到一个优雅的解决方案来打印所需的值而不用至少2个循环与多个计数器如此:

    $last = ""; $i = 0;
while ($row = $result->fetchRow(MDB2_FETCHMODE_ASSOC)) {
    $current = $row['title'];
    if ($current != $last) {
        $i += 1;
        $books[$i]['title'] = $current;
        $books[$i]['author'][] = $row['author'];
        $books[$i]['pages'] = $row['pages'];
    } else {
        $books[$i]['author'][] = $row['author'];
    }
    $last = $current;
}

foreach ($books as $book) {
    $return_result .= 'Title:  '  . $book['title']  . '<br />';
    foreach ($book['author'] as $author) {
        $return_result .= 'Author: '  . $author . '<br />';
    }
    $return_result .= 'Pages:  '  . $book['pages']  . '<br />';  
    $return_result .= '<br />';
}

请告诉我是否有更好的方法,可能在MySQL?

2 个答案:

答案 0 :(得分:4)

GROUP_CONCAT函数将给出一个分隔的作者列表。

SELECT b.title, b.pages, GROUP_CONCAT(a.author)
    FROM books b
        NATURAL JOIN authors a
    WHERE b.title like '%$search%'
    GROUP BY b.title, b.pages;

答案 1 :(得分:2)

这可以通过GROUP_CONCAT()

来完成
SELECT *, GROUP_CONCAT(`authors`.`author`) AS `authors`
FROM `books` 
NATURAL JOIN `authors` 
WHERE `books`.`title` LIKE '%$search%'
GROUP BY `books`.`title`

现在,如果您希望将每个图书的字符串authors分隔为连字符或其他分隔符,则每个图书的作者列表将以逗号分隔。

GROUP_CONCAT(`authors`.`author` SEPARATOR ' - ')

注意:按标题分组并不是将书籍搜索分组的最佳方式,因为许多书籍可能具有相同的标题,从而弄乱了结果。最好按ISBN编号或每本书的其他唯一标识符进行分组。