Search code examples
mysqlsubqueryinner-joinself-join

dependent subquery to self join


How do I change the following dependent subquery to self join?

SELECT d.name, d.created,   
(SELECT SUM( q1.payout ) FROM client AS q1 WHERE q1.uid = d.uid) AS payout,   
(SELECT COUNT( q2.uid ) FROM client AS q2 WHERE q2.uid = d.uid AND q2.winning =1) AS cnt   
FROM client AS d group by d.name, d.created  ORDER BY cnt DESC   LIMIT 0 , 10; 

Solution

  • SELECT  d.name, d.created, SUM(q1.payout) AS psum, COUNT(q2.uid) AS cnt
    FROM    client d
    LEFT JOIN
            client q1
    ON      q1.uid = d.uid
    LEFT JOIN
            client q2
    ON      q2.uid = d.uid
            AND q2.winning =1
    GROUP BY
            d.name, d.created
    ORDER BY
            cnt DESC
    LIMIT 0, 10
    

    If uid is a PRIMARY KEY, you can rewrite it like this:

    SELECT  d.name, d.created, SUM(payout) AS psum, COUNT(IF(winning = 1, uid, NULL)) AS cnt
    FROM    client d
    GROUP BY
            d.name, d.created
    ORDER BY
            cnt DESC
    LIMIT 0, 10