我正在尝试用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?
答案 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编号或每本书的其他唯一标识符进行分组。