Извлечение данных в одном запросе из таблицы сопоставления - PullRequest
1 голос
/ 11 марта 2019

Я хочу получить данные из следующих таблиц, так что мне не нужно вызывать несколько запросов и установить атрибут ответа isLikedByUser . userId Я отправляю в запросе.

Posts - Имя таблицы
userId, postId, text, likesCount, commentsCount

LikeMapping - Имя таблицы
userId, postid

Теперь я написал запрос и извлек данные из первой таблицы на основе userId .Затем выполняются итерации для каждой строки и для каждого postId и userId из запроса найденных строк в таблице 2, и если данные найдены, я устанавливаю атрибут isLikedByUser .

Как мне написать запрос, который может помочь мне заполнить значение атрибута без записи запроса в цикле.

Спасибо

Чтобы уточнить больше isLikedByUser * только 1028 *у атрибута ответа нет столбца ни в одной таблице, и вы хотите установить его как true или false, если сопоставление найдено во второй таблице.

Ответы [ 3 ]

0 голосов
/ 11 марта 2019

Используйте LEFT JOIN для подзапроса вместе с COALESCE, чтобы получить флаг true / false (1/0), если пользователю понравился собственный пост или нет для каждого поста данного пользователя

SELECT p.*, COALESCE(isLikedByUSer, 0)
FROM Posts p
LEFT JOIN (SELECT 1 isLikedByUser, postId, userID FROM LikeMapping) as l ON l.postId = p.postId AND l.userId = p.userId
WHERE p.userId = 100
0 голосов
/ 13 марта 2019

Это может быть быстрее, чем другие ответы.

SELECT p.*,
       lm.postid IS NOT NULL AS isLikedByUser
    FROM Posts AS p
    LEFT JOIN ( SELECT DISTINCT postid FROM LikeMapping ) AS lm
          ON lm.postid = p.postid

Какая версия MySQL? Это, вероятно, нужно 5,6 или позже.

Пожалуйста, укажите EXPLAIN SELECT ..., если хотите обсудить дальше.

0 голосов
/ 11 марта 2019

Вам необходимо использовать операторы LEFT OUTER JOIN и CASE.Должно работать что-то вроде ниже.

Select  p.*,
        case count(lm.postid) when 0 then true else false end as isLikedByUser
    from  Posts p
    LEFT OUTER JOIN  LikeMapping lm  ON p.postId = lm.postId
    WHERE  lm.userId = userIdFromRequest
    group by  userId, postId, text, likesCount, commentsCount;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...