Ссылочный столбец подзапроса во внешнем основном SQL - PullRequest
0 голосов
/ 28 марта 2020

Для сценария онлайн-курса

Это SQL Я написал:

  SELECT l.`id` as parent_lesson_id, l.bigImageURL, l.name, 
(SELECT `percent` as percent FROM courses.`lesson_sessions` 
WHERE lesson_id = parent_lesson_id AND user_id = 52461 ORDER BY `percent` DESC LIMIT 1) as percent  
FROM courses.lessons l  
WHERE l.courseID = 1 AND percent > 30 
ORDER by `order` ASC

Я использую подзапрос, потому что я возвращаю одну строку (которая имеет самый высокий процентов), и не все из них. Если бы я использовал LEFT JOIN, я не знаю, как бы вернуть только те строки, которые имеют наибольший процент для этого parent_lesson_id

У урока может быть много урок lesson_sessions, каждый из которых имеет процент

I получаю следующее сообщение об ошибке при выполнении этого запроса:

#1054 - Unknown column 'percent' in 'where clause'

Проблема, которую я пытаюсь решить:

Как вернуть все строки урока, где процент> 30, принимая только строка с наибольшим процентом, относящаяся к уроку из таблицы сессий урока (урок может иметь много сессий, каждая с разным процентом завершения урока).

В основном я хочу вернуть все уроки, где самый высокий процент> 30

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Вы пытаетесь использовать производный столбец в предложении WHERE, и это запрещено:

WHERE .... AND percent > 30

percent является производным столбцом.

MySql позволяет использовать производные столбцы в предложении HAVING, поэтому измените его на:

SELECT 
  l.id as parent_lesson_id, l.bigImageURL, l.name, 
  (
    SELECT percent FROM courses.lesson_sessions 
    WHERE lesson_id = l.id AND user_id = 52461 
    ORDER BY percent DESC LIMIT 1
  ) percent 
FROM courses.lessons l
WHERE l.courseID = 1 
HAVING percent > 30
ORDER by l.`order` ASC
1 голос
/ 28 марта 2020

Если вы хотите использовать максимальный процент где-то еще, чем внутри вашего подзапроса, то переместите подзапрос из предложения SELECT в предложение FROM. Для этого получите максимум по уроку с агрегацией.

SELECT 
  l.id as parent_lesson_id, 
  l.bigImageURL, 
  l.name, 
  p.max_percent as percent  
FROM courses.lessons l  
JOIN
(
  SELECT lesson_id, max(percent) as max_percent
  FROM courses.lesson_sessions 
  WHERE user_id = 52461 
  GROUP BY lesson_id
  HAVING max(percent) > 30
) p ON p.lesson_id = l.id;
WHERE l.courseID = 1
ORDER by order ASC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...