У меня есть следующее 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 отформатировать результат запроса так, как я хочу, чтобы он отображался.
Постскриптум Извиняюсь за маленькую картинку. Это намного больше, если открыть в новой вкладке.
Ваш запрос, сгенерированный этой вещью Liferay, которую вы используете, отвлекающе странен. Но это кажется правильным. Надеюсь, все эти странные OR '' IS NULL
пункты не портят производительность.
Вы, кажется, имеете дело со схемой имя / значение в вашем biobankattributelists
Таблица.
Ваша проблема здесь заключается в форматировании набора результатов для отображения. Как вы указали, вся необходимая информация находится в наборе результатов. Что вам нужно сделать, на вашем языке хоста (Java? Php? Мы не можем сказать по вашему вопросу), это прочитать набор результатов и сконструировать ваш вывод.
Если вы можете изменить запрос, я предлагаю вам добавить это ORDER BY
пункт до его конца.
ORDER BY organization_.name,
biobankattributelists.attributeListName,
biobankattributelists.attributeListValue
Вы хотите, чтобы строки результирующего набора отображались в том порядке, в котором они вам нужны для построения выходных данных.
Затем вы хотите реализовать в своей основной программе то, что люди, пишущие отчеты, называют логика прерывания управления. То есть вы хотите делать что-то особенное каждый раз, когда значение столбца изменяется по сравнению с его предыдущим значением. Например, каждый раз, когда изменяется название организации, вы хотите отобразить новое имя организации.
С уважением, это выходит за рамки SO ответа, чтобы научить вас делать это.
Других решений пока нет …