7月27日更新

今天在解决另一个问题时,无意中找了下文中提到的分隔符问题(主要是对mysql不熟悉,否则也不能称为问题)。解决办法也很简单,用replace函数就可以了。

{{#cargo_query:
tables=Book_Info, Author
|fields=Book_Info.Cover, Book_Info._pageTitle, Book_Info._pageName, REPLACE(GROUP_CONCAT(Author.Name), ",", "、"),
|where=Seires LIKE "{{PAGENAME}}"
|join on=Book_Info._pagename=Author._pagename
|group by=Book_Info.BookName
}}

默认情况下,REPLACE函数是不能用的,所以要在LocalSettings.php中加入如下代码:

$wgCargoAllowedSQLFunctions[] = 'REPLACE';

6月22日原文

在我的使用案例中,书籍的作者被我放进了另外一个叫做Author的表中,而有些书可能有好几位作者,那么在查询中如果不分组,就会出现如果一本书有两位作者就会生成两条记录,三位作者就是三条,其他信息都是一样的,见下图:
book-no-group_by.png
而如果使用group by将同一本书分类后,作者就只显示第一位,其他作者都不显示,见下图:
book-group_by.png
对于这类需求的处理,MySQL中会使用group concat函数,但是官方文档中并没有提到默认开启了该项。抱着试试的心态,将Author.Name字段放入GROUP_CONCAT函数(Cargo中的SQL函数均为大写)中,代码如下:

{{#cargo_query:
tables=Book_Info, Author
|fields=Book_Info.Cover, Book_Info._pageTitle, Book_Info._pageName, GROUP_CONCAT(Author.Name)
|where=Seires LIKE "{{PAGENAME}}"
|join on=Book_Info._pagename=Author._pagename
|group by=Book_Info.BookName
}}

竟然成功了,都不需要手动开启(不知道是不是升级后新加的功能函数),最终效果见下图:
Book-Group_Concat.png
不过有一点小遗憾,就是该函数的默认分隔符,(英文逗号)好像没办法改,尝试用MYSQL中的语法,结果报错了。

最后修改:2024 年 08 月 23 日
如果觉得我的文章对你有用,请随意赞赏