简体   繁体   English

SQL LEFT JOIN无法正常工作

[英]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: 我的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              |
| ... | ...                  | ...            |
+-----+----------------------+----------------+

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. 我期待WV构造的另一行,但它没有出现。 Anyone who knows where i am wrong with this one? 有谁知道我错在哪一个?

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: 我没有使用额外的JOIN,而是尝试在我的ON子句中使用子查询,它给出了我的下一个结果:

+-----------+-----------+-------------------+------+
| 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. 我要感谢大家帮我解决这个问题。

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 ? 结果是什么 ?

This may not solve the problem, but why RIGHT JOIN property ? 这可能无法解决问题,但为什么RIGHT JOIN property

LEFT JOIN property instead would make more sense. 相反, LEFT JOIN property更有意义。

You see, transaction table is already LEFT JOIN ed to the unit_type which I assume is the base table of this query. 你看, transaction表已经LEFT JOIN ed到unit_type ,我假设它是这个查询的基表。

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM