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的表中,而有些书可能有好几位作者,那么在查询中如果不分组,就会出现如果一本书有两位作者就会生成两条记录,三位作者就是三条,其他信息都是一样的,见下图:
而如果使用group by将同一本书分类后,作者就只显示第一位,其他作者都不显示,见下图:
对于这类需求的处理,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
}}
竟然成功了,都不需要手动开启(不知道是不是升级后新加的功能函数),最终效果见下图:
不过有一点小遗憾,就是该函数的默认分隔符,
(英文逗号)好像没办法改,尝试用MYSQL中的语法,结果报错了。