SQL LEFT JOIN无法正常工作

时间:2012-08-01 12:05:03

标签: mysql

我无法从查询中获取结果。 我想获取交易中单位销售的总和和总数,其中交易是特定的邮政编码。

以下是我的表格:

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)
    ...
 )

我的 unit_types 表格包含以下记录:

+-----+----------------------+----------------+
| 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              |
| ... | ...                  | ...            |
+-----+----------------------+----------------+

以下是我的查询结果:

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

导致:

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

我期待另一行 WV构建,但它没有显示出来。有谁知道我错在哪一个?

5 个答案:

答案 0 :(得分:1)

我设法解决了我的问题。我想和你分享我的结果:

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

我没有使用额外的JOIN,而是尝试在我的ON子句中使用子查询,这给出了我的下一个结果:

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

我要感谢大家帮我解决这个问题。

答案 1 :(得分:0)

我认为这是正确的联接导致问题。

试试这个:

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

结果是什么?

答案 2 :(得分:0)

这可能无法解决问题,但为什么RIGHT JOIN property

相反,{p> LEFT JOIN property会更有意义。

您看,transaction表已LEFT JOIN已编入unit_type,我认为该表是此查询的基表。

答案 3 :(得分:0)

Right Right将有效地撤消LEFT JOIN之前的点

答案 4 :(得分:0)

试试这个:

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

更新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