Sql Query для объединения 4 таблиц, используя условие if или CASE - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть 4 таблицы для чата.

Таблица-1 (основная таблица комментариев, пользователь для Таблицы-1 считается из Таблицы-2)


id

комментарии


Таблица-2 (при добавлении нового комментария в таблицу-1 таблица-2 также будет обновляться сuser_id комментатора)


comment_id (ссылка на Таблицу-1)

user_id


Таблица-3 (делает некоторыедругие работы, но связанные с таблицей-1 через comment_id)


id

column_related_to_table-3

comment_id

user_id


table-4 (выполняет некоторые другие работы, но связанные с Table-1 через comment_id)


id

column_related_to_table-4

comment_id

user_id


Теперь я хочу получить comment_id из всех таблиц (Table-2, Table-3, Table-4) и, наконец, получить комментарии, используя эти comment_id изТаблица-1, если частицыПользователь r присутствует в любой из таблиц.

SELECT A.id,A.comment,
FROM Table-1 A  
LEFT JOIN Table-2 B 
ON B.comment_id = A.id
LEFT JOIN Table-3 C 
ON C.comment_id = A.id OR C.user_id = {$current_user}
LEFT JOIN Table-4 D
ON D.comment_id = A.id OR D.user_id = {$current_user}
WHERE  B.`user` = {$current_user}
GROUP BY A.`id`
ORDER BY A.`id` DESC
LIMIT 7 OFFSET 0

И я также попробовал объединить 3 таблицы

Select A.id AS cid
FROM Table-1 A
LEFT JOIN Table-2 B
ON B.comment_id = A.id
WHERE B.user_id = {$current_user}
UNION
Select C.comment_id AS cid
FROM Table-3 C
WHERE C.user_id = {$current_user}
UNION
Select D.comment_id AS cid
FROM Table-4 D
WHERE D.user_id = {$current_user} 

Но здесь я не знаю, как получить "GROUP"По A. id, ЗАКАЗ по A. id DESC LIMIT 7 OFFSET 0 "работает и не знаю, как получить комментарии из Таблицы-1, используя идентификаторы, которые я получаю от union.

enter image description here

enter image description here

Таблица-1 (действие) Таблица-2 (комментарии) Таблица-2 (комментарии) Идентификатор подключенв таблицу-1 (активность) в качестве data-id.Я связываю таблицу 2 (чтобы узнать время и комментарий пользователя и т. Д.) В таблице 1.

Таблица-3 (чат) Идея здесь в том, что один комментарий может иметь тему, представленную в чате.Это всегда будет связано с комментарием.enter image description here

Table-4 (chat_followers) Здесь можно пинговать других пользователей, чтобы все, кого пингуют в чате, были здесь enter image description here

В конце концов, идея состоит в том, чтобы получить «все комментарии пользователя», если он написал этот комментарий или ответил в чате (Тема для комментария) или если он пингуется кем-либо еще.

1 Ответ

0 голосов
/ 11 апреля 2019

Поскольку вам не нужны никакие данные, кроме идентификаторов комментариев из таблиц 2,3,4, почему бы вам не использовать простое предложение IN?

SELECT * 
FROM Table1 A
WHERE A.id IN 
(SELECT Comment_Id FROM Table2 WHERE.... UNION ALL 
SELECT Comment_ID FROM Table3 WHERE... UNION ALL 
SELECT Comment_Id FROM Table4 WHERE...)
GROUP BY A.`id`
ORDER BY A.`id` DESC
LIMIT 7 OFFSET 0

Если вы хотите использовать дополнительные столбцы из других таблиц, вы можете получить эту работу с помощью LEFT OUTER JOIN:

SELECT A.id,A.comment
FROM 
    Table-1 A  LEFT JOIN 
    Table-2 B ON B.comment_id = A.id AND B.User = currentUserId LEFT JOIN 
    Table-3 C ON C.comment_id = A.id AND C.User = currentUserId LEFT JOIN 
    Table-4 D ON D.comment_id = A.id AND D.User = currentUserId
WHERE  B.id IS NOT NULL OR C.id IS NOT NULL OR D.id IS NOT NULL
GROUP BY A.`id`
ORDER BY A.`id` DESC
LIMIT 7 OFFSET 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...