2011-11-21 66 views
0

我试图做一个简单的搜索查询PHP中:返回一个MySQL的结果与多个值从行

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?

回答

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; 
+0

来自MySQL文档的非常重要的注意事项:结果被截断为由group_concat_max_len系统变量给出的最大长度,该系统变量的默认值为1024.尽管返回的有效最大长度值受max_allowed_pa​​cket的值限制。恕我直言,GROUP_CONCAT只能用于报告目的,而不能与php结合使用,因为它突出了表格设计中的缺陷。 –

+0

我刚刚从相关问题阅读了关于GROUP_CONCAT的内容,但我无法弄清楚它到底在做什么。你能详细说说这里发生了什么吗? – tutuDajuju

+0

没关系,只是在控制台上试了一下,我想我明白了。另外,你怎样才能使用b.title而不是书? MySQL知道选择正确的表,因为它是b中唯一的一个开始? – tutuDajuju

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 ' - ') 

注:分组按标题是不是最好的w ^可以将您的书籍分组,因为很多书籍可能会有相同的标题,从而搞乱了结果。最好按照每本书的ISBN号或其他唯一标识符进行分组。