[英]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.