Как получить данные из таблицы MySQL, если они отсутствуют в одной, но присутствуют в другой?

Как сделать запрос, чтобы выбрать комментарии по теме и получить основные данные о пользователе из таблицы `user` или `userCache` в зависимости от того, где данные в настоящий момент находятся для ускорения сайта? Как можно преобразовать запрос, чтобы избавиться от `avatarInGamesCache` и получать все данные в `avatarInGames` при выборе данных из `userCache`?
  • 21 февраля 2024 г. 6:50
Ответы на вопрос 2
Для этого можно использовать оператор JOIN в MySQL, чтобы объединить данные из двух таблиц и выбрать только те записи, которые отсутствуют в одной из них. Например, запрос может выглядеть следующим образом:

```sql
SELECT column1, column2
FROM table1
LEFT JOIN table2 ON table1.column_name = table2.column_name
WHERE table2.column_name IS NULL;
```

Чтобы выбрать комментарии по теме и получить основные данные о пользователе из таблицы `user` или `userCache`, можно сделать запрос с использованием оператора UNION:

```sql
SELECT comment, user_id, username, email
FROM comments
LEFT JOIN user ON comments.user_id = user.user_id
WHERE topic = 'your_topic'
UNION
SELECT comment, user_id, username, email
FROM comments
LEFT JOIN userCache ON comments.user_id = userCache.user_id
WHERE topic = 'your_topic';
```

Чтобы избавиться от `avatarInGamesCache` и получать все данные в `avatarInGames` при выборе данных из `userCache`, можно внести несколько изменений в запрос, например:

```sql
SELECT comments.comment, 
       IF(userCache.user_id IS NOT NULL, userCache.user_id, user.user_id) AS user_id, 
       IF(userCache.username, userCache.username, user.username) AS username, 
       IF(userCache.email, userCache.email, user.email) AS email, 
       IF(userCache.avatarInGames, userCache.avatarInGames, user.avatarInGames) AS avatarInGames
FROM comments
LEFT JOIN user ON comments.user_id = user.user_id
LEFT JOIN userCache ON comments.user_id = userCache.user_id
WHERE topic = 'your_topic';
```

Этот запрос предполагает использование условных операторов IF для выбора нужных данных из таблиц `user` или `userCache`.
COALESCE ? 
SELECT
    comment.*,
    COALESCE(users.avatarInGames, usersCache.avatarInGames) AS avatarInGames,
    COALESCE(users.gameId, usersCache.gameId) AS gameId
FROM comment
LEFT JOIN users ON comment.UID = users.userId
LEFT JOIN usersCache ON comment.UID = usersCache.userId
WHERE comment.status = 1
ORDER BY comment.OID DESC;

COALESCE(users.avatarInGames, usersCache.avatarInGames) AS avatarInGames avatarInGames берет из users или если его там нет, то возьмет из usersCache.
Похожие вопросы