2016-05-22 3 views
0

У меня есть 4 таблицыИСПОЛЬЗОВАНИЕ предела/смещения в JOIN запросе

  1. учетной запись пользователя

    user_id | username | password       
    ---------+----------+---------- 
    
  2. таблицы проектов

    project_id |   project_name   | category_id 
    ------------+------------------------------+------------- 
    
  3. A user_projects стола (многая много отношение)

    accounts_projects_id | account_id | project_id 
    ----------------------+------------+------------ 
    
  4. project_messages стол (проект будет иметь много сообщений)

    message_id | project_id |message| username 
    ------------+------------+--------+--------- 
    

При входе, я бег запроса, где я выборка числа проектов, пользователь принадлежит и сообщениям для каждый проект, используя приведенный ниже запрос

SELECT account.user_id,account.username, 
     array_agg(json_build_object('message',project_messages.message,'username',project_messages.username)) AS messages, 
project.project_name 
FROM account 
    JOIN accounts_projects ON account.user_id = accounts_projects.account_id 
    JOIN project_messages ON accounts_projects.project_id = project_messages.project_id 
    JOIN project ON project.project_id = accounts_projects.project_id 
WHERE account.username=$1 
GROUP BY project.project_name,account.user_id 

это дает мне ниже выход

userid,username, messages (json array object),project_name` 
87;"kannaj";"{"{\"message\" : \"saklep\", \"username\" : \"kannaj\"}"}";"Football with Javascript" 
87;"kannaj";"{"{\"message\" : \"work\", \"username\" : \"kannaj\"}","{\"message\" : \"you've been down to long in the midnight sea\", \"username\" : \"kannaj\"}","{\"message\" : \"Yeaaaa\", \"username\" : \"house\"}"}";"Machine Learning with Python" 
87;"kannaj";"{"{\"message\" : \"holyy DIVVEERRR\", \"username\" : \"kannaj\"}"}";"Beethoven with react" 

Есть ли способ, которым я могу использовать функцию LIMIT/OFFSET при получении сообщений из таблицы project_messages?

+0

Использование подзапросов или использовать подмассив как '(array_agg (...))? [3: 5]' – Abelisto

+0

Подмассив бросает синтаксическую ошибку :(.. где я должен поместить подзапрос – Kannaj

+0

@Elad Это ограничивает всю таблицу, не каждая группа. – Abelisto

ответ

0

Для того, чтобы наши примеры проще позволяет сказать, что у нас есть две связанные таблицы:

t1(id); 
t2(id, t1_id); 

И запрос

select t1.id, array_agg(t2.id) 
from t1 join t2 on (t1.id = t2.t1_id) 
group by t1.id; 

Это очень упрощенный вариант вашего большого запроса, как вы можете видеть.

1) Массивы

select t1.id, (array_agg(t2.id order by t2.id desc))[3:5] 
from t1 join t2 on (t1.id = t2.t1_id) 
group by t1.id; 

Этот запрос работает точно так же, как оригинал, но возвращает только с 3,4 и 5 элементов массива, который равен offset 2 limit 3.

2) подзапросов и lateral

select 
    t1.id, 
    array_agg(t.x) 
from 
    t1 join lateral 
    (select t2.id as x from t2 where t1.id = t2.t1_id order by t2.id desc offset 2 limit 3) t on (true) 
group by t1.id; 

Здесь lateral ключевое слово позволяет использовать поля из других таблиц, указанных в главном from пункте в нашем подзапроса (t1.id).

+0

Я получаю синтаксическую ошибку при использовании оператора среза .. '' 'ERROR: синтаксическая ошибка при или рядом с "[" '' ':(... я не могу использовать боковые ключевые слова, когда есть другие объединения. Есть ли что-то, что я не вижу? – Kannaj

+0

@Kunkka 1) Включите целую функцию 'array_agg' в скобки:' (array_agg (...)) [n: m] '2) Проверьте мое редактирование, это проще понять. – Abelisto

+0

сейчас он работает :) .. У меня есть еще один вопрос, хотя .. есть ли способ включить предложение ORDER BY? – Kannaj

Смежные вопросы