mysql Ошибка подзапроса Неизвестный столбец «tv.last_time» в «где предложение» - PullRequest
0 голосов
/ 28 ноября 2018

Когда я использую mysql для выполнения подзапросов, я получаю столбец Unknown 'tv.last_time' в 'where clause', что мне делать?Я хочу использовать внешние условия для фильтрации несоответствующих записей при выполнении подзапросов

SELECT
    info_topic.*, b.newMessage
FROM
    info_topic
LEFT JOIN `info_topic_visit` AS tv ON tv.topic_id = info_topic.id
AND tv.user_id = 225
LEFT JOIN (
    SELECT
        p.topic_id,
        count(*) AS newMessage
    FROM
        info_post p
    WHERE
        p.create_time > tv.last_time
    GROUP BY
        p.topic_id
) AS b ON b.topic_id = info_topic.id
ORDER BY b.newMessage DESC

схема базы данных:

CREATE TABLE `info_topic` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT 'topic name',
  `summary` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT 'summary`',
  `create_time` datetime DEFAULT NULL COMMENT '',
  `sort` int(11) DEFAULT '0' COMMENT '',
  PRIMARY KEY (`id`),
);

CREATE TABLE `info_topic_visit` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `topic_id` int(11) DEFAULT '0' COMMENT '',
  `user_id` int(11) DEFAULT '0' COMMENT '',
  `last_time` datetime DEFAULT NULL COMMENT '',
  PRIMARY KEY (`id`)
);

1 Ответ

0 голосов
/ 28 ноября 2018

Проблема с вашим подзапросом заключается в том, что псевдоним tv не имеет никакого значения, поэтому вы не можете ссылаться на что-либо из таблицы, которой соответствует этот псевдоним.Один из подходов состоит в том, чтобы вместо этого преобразовать ваш подзапрос в коррелированный подзапрос в предложении select:

SELECT
    i.*,
    (SELECT COUNT(*) FROM info_post p
     WHERE p.create_time > tv.last_time AND p.topic_id = i.id) AS newMessage
FROM info_topic i
LEFT JOIN info_topic_visit AS tv
    ON tv.topic_id = info_topic.id AND tv.user_id = 225
LEFT JOIN info_topic_member tm
    ON i.id = tm.topic_id AND
       tm.del_flag = 0    AND
       tm.apply_status = i.open_type AND
       tm.user_id = 225
WHERE
    i.del_flag = 0 AND
    i.id > 0       AND
    tm.id IS NOT NULL
ORDER BY
    newMessage DESC;

Может также быть способ реструктурировать ваш запрос, чтобы вам не нужно было использовать коррелированные подзапросы, которыенеэффективны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...