J. Ghyllebert
J. Ghyllebert

Reputation: 2027

SQL LEFT JOIN not working properly

I'm having trouble getting the result out of my query. I want to fetch the sum and total count of an unit sale in transactions, where the transaction is in a specific zip.

Here are my tables:

TABLE unit_type(
    id (Primary key)
    unit_name (varchar)
    department_id (Foreign key)
)

TABLE transaction(
    id (PK)
    commission_fix_out (int)
    transaction_end_week (int)
    property_id (FK)
    unit_type_id (FK)
    ...
)

TABLE property(
    id (PK)
    property_zip_id (FK)
    ...
 )

My unit_types table has the following records:

+-----+----------------------+----------------+
| id  | unit_name            | department_id  |
+-----+----------------------+----------------+
| 1   | WV construction      | 1              |
| 2   | WV resale            | 1              |
| 3   | WV rent              | 1              |
| 4   | BV industrial sale   | 2              |
| 5   | BV industrial rent   | 2              |
| ... | ...                  | ...            |
+-----+----------------------+----------------+

Here's how my query looks like:

SELECT SUM(commission_fix_out), COUNT(commission_fix_out), unit_name, ut.id
FROM unit_type as ut
LEFT JOIN transaction as t
ON ut.id = t.unit_type_id
RIGHT JOIN property as p
ON (p.id = t.property_id AND p.property_zip_id = 1459)
WHERE ut.department_id = 1
GROUP BY unit_name
ORDER BY ut.id

which results in:

+------------+-------------+-------------+---------+
| SUM(...)   | COUNT(..)   | unit_name   | ut.id   |
+------------+-------------+-------------+---------+
| 40014      | 11          | WV resale   | 2       |
| NULL       | 0           | WV rent     | 3       |
+------------+-------------+-------------+---------+

I was expecting another row with WV construction, but it doesn't show up. Anyone who knows where i am wrong with this one?

Upvotes: 4

Views: 3147

Answers (5)

J. Ghyllebert
J. Ghyllebert

Reputation: 2027

I managed to fix my problem. I'd like to share my result with you:

SELECT SUM(commission_fix_out), COUNT(commission_fix_out), unit_name
FROM unit_type ut
LEFT JOIN transaction t
ON (ut.id = t.unit_type_id AND t.property_id IN (SELECT id FROM property p WHERE
property_zip_id = 1459))   
WHERE department_id = 1
GROUP BY unit_name
ORDER BY ut.id

Instead of using an extra JOIN, i'd tried using a subquery in my ON-clause which gives my next results:

+-----------+-----------+-------------------+------+
| SUM(..)   | COUNT()   | unit_name         | id   |
+-----------+-----------+-------------------+------+
| NULL      | 0         | WV construction   | 1    |
| 40014     | 11        | WV resale         | 2    |
| NULL      | 0         | WV rent           | 3    |
+-----------+-----------+-------------------+------+

I'd like to thank everyone helping me to fix this question.

Upvotes: 1

John Woo
John Woo

Reputation: 263683

try this:

SELECT    SUM(commission_fix_out), 
          COUNT(commission_fix_out), 
          unit_name, 
          ut.id
FROM      unit_type as ut
             LEFT JOIN `transaction` as t
                 ON ut.id = t.unit_type_id
             LEFT JOIN `property` p
                 ON p.id = t.property_id
WHERE     ut.department_id = 1 AND
          p.property_zip_id = 1459
GROUP BY  unit_name, p.property_zip_id -- added another column
ORDER BY  ut.id

UPDATE 1

SELECT *
FROM
    (
        (
            SELECT    SUM(commission_fix_out) total_fix_out, 
                      COUNT(commission_fix_out) count_fix_out, 
                      unit_name, 
                      ut.id
            FROM      unit_type as ut
                         LEFT JOIN `transaction` as t
                             ON ut.id = t.unit_type_id
                         LEFT JOIN `property` p
                             ON p.id = t.property_id
            WHERE     ut.department_id = 1 AND
                      p.property_zip_id = 1459
            GROUP BY  unit_name, p.property_zip_id -- added another column
            ORDER BY  ut.id
        ) tableA
        UNION
        (
            SELECT  0 as total_fix_out,
                    0 as count_fix_out,
                    unit_name,
                    id
            FROM    unit_type
            WHERE   id NOT IN
                    (
                        SELECT  DISTINCT xx.id
                        FROM    unit_type as xx
                                     LEFT JOIN `transaction` as t
                                         ON xx.id = t.unit_type_id
                                     LEFT JOIN `property` p
                                         ON p.id = t.property_id
                        WHERE     xx.department_id = 1 AND
                                  p.property_zip_id = 1459
                    )
        ) tableA
    ) tableC

Upvotes: 0

cedric
cedric

Reputation: 302

I think it's the right join cause the problem.

try this :

SELECT SUM(commission_fix_out), COUNT(commission_fix_out), unit_name, ut.id
FROM unit_type as ut
LEFT JOIN transaction as t
ON ut.id = t.unit_type_id
WHERE ut.department_id = 1
GROUP BY unit_name
ORDER BY ut.id

what is the result ?

Upvotes: 0

MakkyNZ
MakkyNZ

Reputation: 2257

That Right Join will effectively undo the point of the LEFT JOIN before it

Upvotes: 0

bpgergo
bpgergo

Reputation: 16037

This may not solve the problem, but why RIGHT JOIN property?

LEFT JOIN property instead would make more sense.

You see, transaction table is already LEFT JOINed to the unit_type which I assume is the base table of this query.

Upvotes: 0

Related Questions