我有以下MySQL
查询,它可以获取我需要的所有信息。
SELECT biobank.*, organization_.name, biobankattributelists.*
FROM biobank INNER JOIN organization_ ON biobank.biobankDbId = organization_.organizationId
LEFT JOIN biobankattributelists ON biobank.biobankDbId=biobankattributelists.biobankDbId
WHERE ((organization_.name LIKE '%%' OR '' IS NULL)
OR (biobank.biobankId LIKE '%%' OR '' IS NULL)
OR (biobank.acronym LIKE '%%' OR '' IS NULL)
OR (biobankattributelists.attributeListName LIKE '%%' OR '' IS NULL)
OR (biobankattributelists.attributeListValue LIKE '%%' OR '' IS NULL))
AND (biobank.countryCode = '' OR '' = '')
结果为
此处需要注意的重要栏目是biobankDbId, attributeListName, attributeListValue
。每个生物群可以有不同的attributeListName
,每个attributeListName
都有不同的attributeListValue
。 这三者的组合在结果集中是唯一的。例如在rows 2 and 3
; 血清生物库的可用文档 协议/程序和样本目录。
如果我得到这样的结果:
Biobank results = BiobankLocalServiceUtil.searchBiobanks();
for(Biobank row:results){
// To be done....
}
我希望每个按attributeListName
分组的生物库都显示结果。
Name: Biobank For Serum
Automation Services:
Analysis
Available Documents:
Protocols/Procedures, Sample Catalogue
Complementary Services:
Biochemistry Laboratory, Pathology Department/Imaging
.....
我可以通过按原样获取结果并再次进行另一个查询来完成此操作。但是进行多次查询效率低下。更进一步,因为我有这个查询提取所需的一切,我正在寻找解决方案要么通过修改查询,要么在前端说 PHP / JSP 来格式化查询结果,因为我希望它显示。
P.S。为小图片道歉。如果在新标签中打开它会更大。
答案 0 :(得分:1)
您正在使用的Liferay产生的查询令人分心。但它似乎是正确的。希望所有那些奇怪的OR '' IS NULL
条款都不会破坏性能。
您似乎正在处理biobankattributelists
表中的名称/值架构。
此处的问题是格式化显示结果集。正如您所指出的,您需要的所有信息都在结果集中。你需要做什么,用你的宿主语言(Java?php?我们无法从你的问题中说出来),读取结果集并构建你的输出。
如果您可以修改查询,我建议您将此ORDER BY
子句添加到其结尾。
ORDER BY organization_.name,
biobankattributelists.attributeListName,
biobankattributelists.attributeListValue
您希望这样,结果集的行将按照您构建输出所需的顺序显示。
然后,您希望在主机程序中实现人们称之为控制中断逻辑的报告。也就是说,每当列的值从其先前值更改时,您希望执行一些特殊操作。例如,每次组织名称更改时,您都希望显示新的组织名称。
尊重,教你这样做超出了SO答案的范围。