2013-08-31 3 views
4

Вот краткое описание того, что я пытаюсь выполнить; мой запрос приведен ниже.Коррелированный подзапрос в операторе CASE MySQL

Есть 4 таблицы и 1 вид, которые имеют отношение к этому конкретному запросу (извините имена выглядят неаккуратно, но они следуют строгой конвенции, которая будет иметь смысл, если вы увидели полный список):

Performance s может имеют много Performer s, и эти ассоциации хранятся в PPerformer. Fan s может иметь избранное, которое хранится в Favorite_Performer. В обзоре _UpcomingPerformances содержится вся информация, необходимая для отображения удобного списка предстоящих выступлений.

Моя цель состоит в том, чтобы выбрать все данные из _UpcomingPerformance, затем включить еще один столбец, который указывает, имеет ли данный Performance Performer, который Fan добавил в качестве своего любимого. Это включает в себя выбор списка исполнителей, связанных с производительностью, а также список исполнителей, которые находятся в Favorite_Performer для этого вентилятора, и пересечение двух массивов, чтобы определить, что-то общее.

При выполнении нижеследующего запроса я получаю сообщение об ошибке #1054 - Unknown column 'up.pID' in 'where clause'. Я подозреваю, что это как-то связано с неправильным использованием Correlated Subqueries, но насколько я могу судить, что я делаю, это должно работать. Он работает, когда я заменяю up.pID (в предложении WHERE t2) с жестко запрограммированным номером, и да, pID - это существующий столбец _UpcomingPerformance.

Спасибо за любую помощь, которую вы можете предоставить.

SELECT 
    up.*, 
    CASE 
     WHEN EXISTS (
      SELECT * FROM (
       SELECT RID FROM Favorite_Performer 
       WHERE FanID = 107 
      ) t1 
      INNER JOIN 
      (
       SELECT r.ID as RID 
       FROM PPerformer pr 
       JOIN Performer r ON r.ID = pr.Performer_ID 
       WHERE pr.Performance_ID = up.pID 
      ) t2 
      ON t1.RID = t2.RID 
     ) 
     THEN "yes" 
     ELSE "no" 
    END as pText 
FROM 
    _UpcomingPerformances up 

ответ

3

Проблема связана с областью. Вложенные Selects делают таблицу up невидимой внутри внутреннего выбора. Попробуйте следующее:

SELECT 
    up.*, 
    CASE 
     WHEN EXISTS (
      SELECT * 
      FROM Favorite_Performer fp 
       JOIN Performer r ON fp.RID = r.ID 
       JOIN PPerformer pr ON r.ID = pr.Performer_ID 
      WHERE fp.FanID = 107 
       AND pr.Performance_ID = up.pID 
     ) 
     THEN 'yes' 
     ELSE 'no' 
    END as pText 
FROM 
    _UpcomingPerformances up 
+0

Работает как очарование. Спасибо! –

Смежные вопросы