Skip to content

Instantly share code, notes, and snippets.

@akb
Created October 28, 2013 18:48
Show Gist options
  • Save akb/7202401 to your computer and use it in GitHub Desktop.
Save akb/7202401 to your computer and use it in GitHub Desktop.
SELECT
u.id AS user_id,
c.id AS led_campaign_id,
pc.id AS personal_campaign_id,
c2.id AS personal_campaign_campaign_id,
c3.id AS followed_campaign_id
FROM users u
LEFT OUTER JOIN campaigns c ON u.id = c.creator_id
LEFT OUTER JOIN photos p ON c.photo_id = p.id
LEFT OUTER JOIN personal_campaigns pc ON u.id = pc.creator_id AND pc.campaign_id != c.id
LEFT OUTER JOIN campaigns c2 ON pc.campaign_id = c2.id
LEFT OUTER JOIN activities a ON a.campaign_id = c2.id
LEFT OUTER JOIN follows f ON u.id = f.user_id
LEFT OUTER JOIN campaigns c3 ON f.followed_id = c3.id
LEFT OUTER JOIN photos p2 ON c3.photo_id = p2.id
WHERE u.id = 2329
AND f.followed_type = 'Campaign'
ORDER BY
c.created_at DESC,
a.deadline ASC,
c3.created_at DESC
LIMIT 10, 20 \G;
@rf-
Copy link

rf- commented Oct 28, 2013

SELECT
  c.id, pc.id

  FROM
    campaigns c

  LEFT OUTER JOIN follows f
    ON f.followed_id = c.id AND f.user_id = 2329

  LEFT OUTER JOIN personal_campaigns pc
    ON pc.creator_id = 2329 AND pc.campaign_id = c.id

  WHERE
    c.creator_id = 2329 OR f.id

  -- ORDER BY ???
;

Campaign.select('campaigns.*, pc.id').
  joins('LEFT OUTER JOIN follows f ON f.followed_id = campaigns.id AND f.user_id = 2329').
  joins('LEFT OUTER JOIN personal_campaigns pc ON pc.creator_id = 2329 AND pc.campaign_id = campaigns.id').
  where('campaigns.creator_id = 2329 OR f.id').
  limit(100).
  offset(1000).
  includes(:photos)

select * from photos where campaign_id in (1,2,3,4,5,6,7);


campaigns = Campaign.select_from_sql([ ...  ])
Preloader.new(campaigns, [:photos]).run

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment