Эта проблема кажется простой, но я не могу заставить ее работать за один раз.
выберите или вложенный выберите . Получить авторов и (если таковые имеются) советники
бумага (статья) в один ряд.
Я приказываю объяснить проблему, вот две таблицы данных (псевдо)
papers (id, title, c_year)
persons (id, firstname, lastname)
плюс таблица ссылок с одним дополнительным атрибутом (псевдо):
paper_person_roles(
paper_id
person_id
act_role ENUM ('AUTHOR', 'ADVISER')
)
Это в основном список письменных работ (таблица: документы) и список
сотрудников и / или студентов (таблица: человек)
Статья моих авторов (1, N).
Статья может иметь (0, N) советников.
Человек может быть в роли «АВТОР» или «СОВЕТНИК» (но не одновременно).
Приложение в конечном итоге выводит строки таблицы, содержащие следующие
записи:
TH: || Paper_ID | Author(s) | Title | Adviser(s) |
TD: || 21334 |John Doe, Jeff Tucker|Why the moon looks yellow|Brown, Rayleigh|
...
Мой первый подход был такой:
выбрать / извлечь полный список статей в приложение, например,
SELECT
q.id, q.title
FROM
papers AS q
ORDER BY
q.c_year
и сохранить результаты запроса в массив (в приложении). После этого
шаг, цикл по массиву возвращенной информации и извлекать авторов и
советники (если таковые имеются), через подготовленное заявление (? это идентификатор бумаги) из таблицы ссылок
как:
APPLICATION_LOOP(paper_ids in array)
SELECT
p.lastname, p.firstname, r.act_role
FROM
persons AS p, paper_person_roles AS r
WHERE
p.id=r.person_id AND r.paper_id = ?
# The application does further processing from here (pseudo):
foreach record from resulting records
if record.act_role eq 'AUTHOR' then join to author_column
if record.act_role eq 'ADVISER' then join to avdiser_column
end
print id, author_column, title, adviser_column
APPLICATION_LOOP
Это работает до сих пор и дает желаемый результат. Будет ли это сделать
смысл положить вычисления обратно в БД?
Я не очень опытный в нетривиальном SQL и не могу найти
решение с помощью одного (комбинированного или вложенного) вызова select. я
попробовал что-нибудь как
SELECT
q.title
(CONCAT_WS(' ',
(SELECT p.firstname, p.lastname AS aunames
FROM persons AS p, paper_person_roles AS r
WHERE q.id=r.paper_id AND r.act_role='AUTHOR')
)
) AS aulist
FROM
papers AS q, persons AS p, paper_person_roles AS r
в нескольких вариациях, но не повезло ...
Может быть, есть шанс?
Заранее спасибо
круглодонный