Sql-запрос для объединения 4 таблиц с использованием условия if или регистра

#mysql #sql

#mysql #sql

Вопрос:

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

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


ID

Комментарии


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


comment_id(ссылка из таблицы-1)

user_id


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


ID

column_related_to_table-3

comment_id

user_id


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


ID

column_related_to_table-4

comment_id

user_id


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

 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} 
  

Но здесь я не знаю, как получить «ГРУППУ ПО A. id , ПОРЯДОК ПО A. id DESC
ОГРАНИЧЕНИЕ 7 СМЕЩЕНИЕ 0″ работает и не знает, как получить комментарии из таблицы-1, используя идентификаторы, которые я получаю от union.

введите описание изображения здесь

введите описание изображения здесь

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

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

Таблица-4 (chat_followers) Здесь можно пинговать другим пользователям, так что все, кого пингуют в чате, будут здесь введите описание изображения здесь

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

Ответ №1:

Поскольку вам не нужны никакие данные, кроме идентификаторов комментариев из таблиц 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
  

Если вы хотите использовать дополнительные столбцы из других таблиц, вы можете заставить это работать с ЛЕВЫМ ВНЕШНИМ СОЕДИНЕНИЕМ:

 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
  

Комментарии:

1. на самом деле в таблицах 2, 3, 4 есть другие данные в столбцах, связанных с соответствующими таблицами. я только что показал только требуемые столбцы.

2. Не то, что указано в вашем вопросе — вы конкретно сказали, что хотите получить идентификаторы комментариев из этих таблиц!

3. Вы можете добавить дополнительные объединения и сохранить предложение IN

4. Выполнение первого запроса занимает слишком много времени.

5. IN неэффективен, но его легко читать. Запрос на левое соединение может быть намного быстрее, особенно если у вас установлена правильная индексация