phpcodeigniterjoinactiverecordsubquery

Convert SQL containing JOINs, a subquery, GROUP BY and SUM() to CodeIgniter's active record


I have following mysql query

SELECT
    events.id      AS id,
    A.sold_tickets
FROM (`events`)
JOIN `category` AS cat
    ON `events`.`category_id` = `cat`.`id`
JOIN `category` AS sub_cat
    ON `events`.`subCategoryID` = `sub_cat`.`id`
JOIN `events_custom_dates` AS events_date
    ON `events_date`.`event_id` = `events`.`id`
JOIN `my_promos`
    ON `events`.id = `my_promos`.`event_id`
LEFT JOIN `mycalendar`
    ON `mycalendar`.`event_id` = `my_promos`.`event_id`
LEFT JOIN `promo_events_stats`
    ON `promo_events_stats`.`id` = `events`.`id`
LEFT JOIN (
    SELECT
        my_promos.event_id,
        SUM(tickets_sold.quantity) AS sold_tickets
    FROM my_promos
    JOIN tickets_sold
        ON tickets_sold.code = my_promos.link_code
    WHERE my_promos.user_id = '532'
        AND DATE(my_promos.date) >= '2013-11-01'
        AND DATE(my_promos.date) <= '2014-01-22'
    GROUP BY my_promos.event_id
) A
    ON A.event_id = events.id
WHERE
    `my_promos`.`user_id` = '532'
    AND DATE(my_promos.date) >= '2013-11-01'
    AND DATE(my_promos.date) <= '2014-01-22'
GROUP BY my_promos.event_id

I want to convert the JOIN part containing the subquery into the CodeIgniter active record syntax. That is the following:

LEFT JOIN (SELECT
       my_promos.event_id,
       SUM(tickets_sold.quantity) AS sold_tickets
     FROM my_promos
       JOIN tickets_sold
     ON tickets_sold.code = my_promos.link_code
     WHERE my_promos.user_id = '532'
     AND DATE(my_promos.date) >= '2013-11-01'
     AND DATE(my_promos.date) <= '2014-01-22'
     GROUP BY my_promos.event_id) A
ON A.event_id = events.id

I want the above as CodeIgniter's active record.


Solution

  • it is just that simple do it in the following WAY

    $this->db->join('(SELECT my_promos.event_id, SUM(tickets_sold.quantity) AS my_sold_tickets,
                     (IFNULL(SUM(tickets_sold.price),0)*.10) AS earnings, IFNULL(SUM(tickets_sold.price),0) AS sales
                      FROM my_promos
                      JOIN tickets_sold ON tickets_sold.code = my_promos.link_code
                      WHERE my_promos.user_id = '532' AND DATE(my_promos.date) >= '2013-11-01'
                      AND DATE(my_promos.date) <= '2014-01-23'
                      GROUP BY my_promos.event_id) A','A.event_id = events.id', 'left');
    

    SIMPLE.. ! :)