написання sql підзапиту з приведенням типів та склеюванням результатів в строку

здається, sql можна вивчати безконечно - завжди є щось таке, чим ти не користувався, чого ще не знаєш, не вивчив :)

сьогодні розглянемо складніший (не зовсім простий) запит в postgresql -
навчимось писати підзапити postgresql із приведенням типів
+ як значення багатьох рядків в одну строку склеїти

"SELECT id, name, lang "
"(SELECT string_agg( cast(tag_id as varchar), ',') AS tags FROM tags_table WHERE book_id = books_table.id AND status = 1)"
" FROM books_table WHERE user_id = $1 AND (status = 0 OR status = 1) ORDER BY id DESC LIMIT $2 OFFSET $3"

тут ми отримуємо декілька рядів tag_id з таблиці tags_table
(у яких однаковий - певний - book_id та status),
приводимо ці tag_id до строки
cast(tag_id as varchar) і далі склеюємо в csv ці строки за допомогою
string_agg( cast(tag_id as varchar), ',') та отримуємо як одне значення tags

загалом сенс цього запиту такий --
отримати певну кількість рядків (LIMIT)
пропустивши певну кількість рядків з початку (OFFSET)
з таблиці books_table, рядки книг,
які належать користувачу з певними user_id та status,
у кожної книг є декілька тегів,
і ми дістаємо всі tag_id для кожної книги, яку ми дістаємо :)

це все :)

Посилання

https://stackoverflow.com/questions/15847173/concatenate-multiple-result-rows-of-one-column-into-one-group-by-another-column
https://stackoverflow.com/questions/13809547/convert-integer-to-string-in-postgresql