Question

Here is a brief explanation of what I'm trying to accomplish; my query follows below.

There are 4 tables and 1 view which are relevant for this particular query (sorry the names look messy, but they follow a strict convention that would make sense if you saw the full list):

Performances may have many Performers, and those associations are stored in PPerformer. Fans can have favorites, which are stored in Favorite_Performer. The _UpcomingPerformances view contains all the information needed to display a user-friendly list of upcoming performances.

My goal is to select all the data from _UpcomingPerformances, then include one additional column that specifies whether the given Performance has a Performer which the Fan added as their favorite. This involves selecting the list of Performers associated with the Performance, and also the list of Performers who are in Favorite_Performer for that Fan, and intersecting the two arrays to determine if anything is in common.

When I execute the below query, I get the error #1054 - Unknown column 'up.pID' in 'where clause'. I suspect it's somehow related to a misuse of Correlated Subqueries but as far as I can tell what I'm doing should work. It works when I replace up.pID (in the WHERE clause of t2) with a hard-coded number, and yes, pID is an existing column of _UpcomingPerformances.

Thanks for any help you can provide.

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
Was it helpful?

Solution

The problem is scope related. The nested Selects make the up table invisible inside the internal select. Try this:

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top