#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 неэффективен, но его легко читать. Запрос на левое соединение может быть намного быстрее, особенно если у вас установлена правильная индексация