【问题标题】:Format the results fetched by query for display格式化查询获取的结果以供显示
【发布时间】:2015-01-19 16:12:59
【问题描述】:

我有以下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 3Biobank for Serum可用文件Protocols/ProceduresSample Catalogue

假设我得到这样的结果:

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 来格式化我希望显示的查询结果。

附:为小图道歉。如果在新标签中打开,它会更大。

【问题讨论】:

  • 我完全不明白你想要什么:你的查询很奇怪:“LIKE '%%' OR '' IS NULL”'' 永远不会为空!语言是php还是java?答案会因语言而完全不同。也许你可以给对象 Biobank...
  • 那么 * OR '' = '' * 应该做什么?建议把这个装箱,然后重新开始!
  • 请假设查询是正确的。我正在使用 Liferay Java EE 门户框架,查询的显示略有不同。我使用 mysql 查询日志在 sql 工作台中运行查询。因为这是一个没有参数的空查询,它为我获取图片中的结果集。

标签: java php html mysql jsp


【解决方案1】:

您正在使用的 Liferay 生成的查询非常奇怪。但这似乎是正确的。希望所有那些奇怪的OR '' IS NULL 子句不会破坏性能。

您似乎正在处理 biobankattributelists 表中的名称/值模式。

您的问题是格式化您的结果集以供显示。正如您所指出的,您需要的所有信息都在结果集中。您需要用您的宿主语言(Java?php?我们无法从您的问题中看出)读取结果集并构建您的输出。

如果你可以修改查询,我建议你将这个ORDER BY 子句添加到它的末尾。

ORDER BY organization_.name, 
         biobankattributelists.attributeListName,
         biobankattributelists.attributeListValue

您想要这样,结果集的行将按照您构建输出所需的顺序出现。

然后你想在你的宿主程序中实现人们所谓的控制中断逻辑。也就是说,每次列的值从之前的值发生变化时,您都想做一些特别的事情。例如,每次组织名称更改时,您都希望显示新的组织名称。

恕我直言,教你这样做超出了 SO 答案的范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 2011-04-13
    • 2017-01-26
    • 1970-01-01
    • 2012-03-09
    相关资源
    最近更新 更多