0

I am trying to accomplish a full join with three temporary tables in MySql 5.7. I am emulating this (How to do a FULL OUTER JOIN in MySQL?) example but cannot find nor figure out how I'd accomplish that with three tables instead of two.

I've written:

##########################################################################################
#### QUERY GOALS: Number of Members Gained to X trigger & Number of Members Lost from X trigger
# to do 
## add in parameters for ladders 
##########################################################################################


#### DROP TABLE IF EXISTS

DROP TABLE IF EXISTS cte_leenk_ladder_history; 
DROP TABLE IF EXISTS cte_ladder_history_self_join_lh1;
DROP TABLE IF EXISTS cte_ladder_history_self_join_lh2;
DROP TABLE IF EXISTS cte_ladder_history_join_lh1_lh2_current_trigger_record;
DROP TABLE IF EXISTS cte_distinct_completed_trigger_and_moved;
DROP TABLE IF EXISTS cte_completed_trigger_prior_to_date_no_change; 
DROP TABLE IF EXISTS cte_completed_trigger_between_dates_no_change;
DROP TABLE IF EXISTS cte_completed_trigger_between_dates_then_change;    

#set @ladder_value = 'ladder_advocacy';

#### CREATE PARAMETERS FOR LADDERS

    CREATE TEMPORARY TABLE cte_leenk_ladder_history
        SELECT 
        member_id
        ,ladder_change
        ,date_trigger_event
        ,@ladder_value
        ,lh.ladder_config_id as ladder_config_id
        ,trigger_name
        ,coalesce(lh.ladder_advocacy,lh.ladder_elected,lh.ladder_policy,lh.ladder_organizing,lh.ladder_organizing,lh.ladder_engagement) as ladder_value 
        ,CASE WHEN lh.ladder_advocacy is not null THEN 'ladder_advocacy'
               WHEN lh.ladder_elected is not null THEN 'ladder_elected'
               WHEN lh.ladder_policy is not null THEN 'ladder_policy'
               WHEN lh.ladder_organizing is not null THEN 'ladder_organizing'
               WHEN lh.ladder_collective is not null THEN 'ladder_collective'
               WHEN lh.ladder_engagement is not null THEN 'ladder_engagement'
            END
            AS ladder_name
        FROM leeds_new.leenk_ladder_history as lh 
            inner join leeds_new.leenk_ladder_config as lc on lh.ladder_config_id = lc.ladder_config_id
            where lh.ladder_change = 1 and lc.active = 1 and lc.trigger = 1 
        limit 25000;

#### SET UP MASTER TABLE 
create temporary table cte_ladder_history_self_join_lh1 
    select 
        member_id as member_id_lh1, 
        ladder_config_id as ladder_config_id_lh1, 
        trigger_name as trigger_name_lh1,
        date_trigger_event as date_trigger_event_lh1,
        ladder_name as ladder_name_lh1,
        ladder_value as ladder_value_lh1,
        ladder_change as ladder_change_lh1 

    from 
        cte_leenk_ladder_history as lh1; 

create temporary table cte_ladder_history_self_join_lh2 
    select 
        member_id as member_id_lh2, 
        trigger_name as trigger_name_lh2,
        date_trigger_event as date_trigger_event_lh2,
        ladder_name as ladder_name_lh2,
        ladder_value as ladder_value_lh2,
        ladder_change as ladder_change_lh2  

    from 
        cte_leenk_ladder_history as lh2; 

#### Current ladder history

create temporary table cte_ladder_history_join_lh1_lh2_current_trigger_record 
    select 
        cte_ladder_history_self_join_lh1.member_id_lh1,
        cte_ladder_history_self_join_lh1.ladder_config_id_lh1,
        cte_ladder_history_self_join_lh1.trigger_name_lh1,
        cte_ladder_history_self_join_lh1.date_trigger_event_lh1,
        cte_ladder_history_self_join_lh1.ladder_name_lh1,
        cte_ladder_history_self_join_lh1.ladder_value_lh1,
        cte_ladder_history_self_join_lh1.ladder_change_lh1,
        cte_ladder_history_self_join_lh2.member_id_lh2,
        cte_ladder_history_self_join_lh2.trigger_name_lh2,
        cte_ladder_history_self_join_lh2.date_trigger_event_lh2,
        cte_ladder_history_self_join_lh2.ladder_name_lh2,
        cte_ladder_history_self_join_lh2.ladder_value_lh2,
        cte_ladder_history_self_join_lh2.ladder_change_lh2,
        @member_id:=member_id_lh2 AS member_id,
        @row_number:=(CASE
                WHEN @member_id = member_id_lh1
                THEN @row_number + 1
                ELSE 1
            END) AS rank

    from 
        cte_ladder_history_self_join_lh1 #previous or current ladder history 
            left join cte_ladder_history_self_join_lh2 on cte_ladder_history_self_join_lh1.member_id_lh1 = cte_ladder_history_self_join_lh2.member_id_lh2
                and cte_ladder_history_self_join_lh2.ladder_name_lh2 = cte_ladder_history_self_join_lh1.ladder_name_lh1
                and cte_ladder_history_self_join_lh1.ladder_value_lh1 <> cte_ladder_history_self_join_lh2.ladder_value_lh2
                and cte_ladder_history_self_join_lh1.date_trigger_event_lh1 < cte_ladder_history_self_join_lh2.date_trigger_event_lh2 # lh2 shows second begin date / end date for lh if exists
        where @row_number:=(CASE
                WHEN @member_id = member_id_lh1
                THEN @row_number + 1
                ELSE 1
           END) = 1
        order by member_id_lh1 desc, date_trigger_event_lh2 desc; 

#### count people who completed X trigger level prior to date and havent changed ever  
    create temporary table cte_completed_trigger_prior_to_date_no_change
        select 
            cte_ladder_history_join_lh1_lh2_current_trigger_record.trigger_name_lh1 as trigger_name__prior_to_date_no_change, #try removing trigger name grouping for ladder level counts
            cte_ladder_history_join_lh1_lh2_current_trigger_record.ladder_value_lh1,
            count(cte_ladder_history_join_lh1_lh2_current_trigger_record.trigger_name_lh1) as count_trigger_prior_no_change

        from cte_ladder_history_join_lh1_lh2_current_trigger_record
            where date_trigger_event_lh1 < CAST('2018-01-01' AS DATE)
            and member_id_lh2 is null
        group by trigger_name_lh1, ladder_value_lh1
        order by ladder_value_lh1 asc; 

#### count people who completed X trigger level between dates that never became something else 
    create temporary table cte_completed_trigger_between_dates_no_change
        select 
            cte_ladder_history_join_lh1_lh2_current_trigger_record.trigger_name_lh1 as trigger_name__between_dates_no_change,
            cte_ladder_history_join_lh1_lh2_current_trigger_record.ladder_value_lh1,
            count(cte_ladder_history_join_lh1_lh2_current_trigger_record.trigger_name_lh1) as count_trigger_between_no_change

        from cte_ladder_history_join_lh1_lh2_current_trigger_record
            where date_trigger_event_lh1 BETWEEN CAST('2018-01-01' AS DATE) AND CAST('2018-12-01' AS DATE)
            and member_id_lh2 is null 
        group by trigger_name_lh1, ladder_value_lh1
        order by ladder_value_lh1 asc; 

#### count people who completed X trigger level between dates AND became something else (people who moved on)
    create temporary table cte_completed_trigger_between_dates_then_change
        select 
            cte_ladder_history_join_lh1_lh2_current_trigger_record.trigger_name_lh1 as trigger_name__between_dates_change,
            cte_ladder_history_join_lh1_lh2_current_trigger_record.ladder_value_lh1,
            count(cte_ladder_history_join_lh1_lh2_current_trigger_record.trigger_name_lh1) as count_trigger_between_then_change

        from cte_ladder_history_join_lh1_lh2_current_trigger_record
            where date_trigger_event_lh1 BETWEEN CAST('2018-01-01' AS DATE) AND CAST('2018-12-01' AS DATE)
            and member_id_lh2 is not null 
        group by trigger_name_lh1, ladder_value_lh1
        order by ladder_value_lh1 asc; 

#### join the counts together - do this 3 times, for each table 

/* t1 t2 */ 
        select * from cte_completed_trigger_prior_to_date_no_change
            left join cte_completed_trigger_between_dates_no_change on cte_completed_trigger_prior_to_date_no_change.trigger_name__prior_to_date_no_change = cte_completed_trigger_between_dates_no_change.trigger_name__between_dates_no_change
            union 
        select * from cte_completed_trigger_prior_to_date_no_change
            right join cte_completed_trigger_between_dates_no_change on cte_completed_trigger_prior_to_date_no_change.trigger_name__prior_to_date_no_change = cte_completed_trigger_between_dates_no_change.trigger_name__between_dates_no_change

/* t1 t3 */
        select * from cte_completed_trigger_prior_to_date_no_change
            left join cte_completed_trigger_between_dates_then_change on cte_completed_trigger_prior_to_date_no_change.trigger_name__prior_to_date_no_change = cte_completed_trigger_between_dates_then_change.trigger_name__between_dates_change
            union 
        select * from cte_completed_trigger_prior_to_date_no_change
            right join cte_completed_trigger_between_dates_then_change on cte_completed_trigger_prior_to_date_no_change.trigger_name__prior_to_date_no_change = cte_completed_trigger_between_dates_then_change.trigger_name__between_dates_change
/* t2 t3 */ 
        select * from cte_completed_trigger_between_dates_no_change
            left join cte_completed_trigger_between_dates_then_change on cte_completed_trigger_between_dates_no_change.trigger_name__between_dates_no_change = cte_completed_trigger_between_dates_then_change.trigger_name__between_dates_change
            union 
        select * from cte_completed_trigger_between_dates_no_change
            right join cte_completed_trigger_between_dates_then_change on cte_completed_trigger_between_dates_no_change.trigger_name__between_dates_no_change = cte_completed_trigger_between_dates_then_change.trigger_name__between_dates_change

the joins in question are at the end of the query. I'm getting an "error in syntax". I've also tried this approach (How to FULL OUTER JOIN multiple tables in MySQL), and this approach ((My)SQL full join with three tables)

Thoughts?

aks85
  • 695
  • 3
  • 11
  • 24
  • What is the exact error message? – Barmar Dec 18 '18 at 02:05
  • `ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select * from cte_completed_trigger_prior_to_date_no_change left joi' at line 5` – aks85 Dec 18 '18 at 02:05
  • It runs fine until I try to to do the full outer join bandaid at the end. – aks85 Dec 18 '18 at 02:06

1 Answers1

0

You have UNION in the wrong places.

    /* t1 t2 */ 
    select * from cte_completed_trigger_prior_to_date_no_change
        left join cte_completed_trigger_between_dates_no_change on cte_completed_trigger_prior_to_date_no_change.trigger_name__prior_to_date_no_change = cte_completed_trigger_between_dates_no_change.trigger_name__between_dates_no_change
        right join cte_completed_trigger_between_dates_no_change on cte_completed_trigger_prior_to_date_no_change.trigger_name__prior_to_date_no_change = cte_completed_trigger_between_dates_no_change.trigger_name__between_dates_no_change

    union all
    /* t1 t3 */
    select * from cte_completed_trigger_prior_to_date_no_change
        left join cte_completed_trigger_between_dates_then_change on cte_completed_trigger_prior_to_date_no_change.trigger_name__prior_to_date_no_change = cte_completed_trigger_between_dates_then_change.trigger_name__between_dates_change
        right join cte_completed_trigger_between_dates_then_change on cte_completed_trigger_prior_to_date_no_change.trigger_name__prior_to_date_no_change = cte_completed_trigger_between_dates_then_change.trigger_name__between_dates_change
    union all
    /* t2 t3 */ 
    select * from cte_completed_trigger_between_dates_no_change
        left join cte_completed_trigger_between_dates_then_change on cte_completed_trigger_between_dates_no_change.trigger_name__between_dates_no_change = cte_completed_trigger_between_dates_then_change.trigger_name__between_dates_change
        right join cte_completed_trigger_between_dates_then_change on cte_completed_trigger_between_dates_no_change.trigger_name__between_dates_no_change = cte_completed_trigger_between_dates_then_change.trigger_name__between_dates_change
Barmar
  • 741,623
  • 53
  • 500
  • 612