4

クエリから結果を取得するのに問題があります。トランザクションが特定の zip にある場合、トランザクションの単位販売の合計数と合計数を取得したいと考えています。

ここに私のテーブルがあります:

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 constructionで別の行を期待していましたが、表示されません。私がこれでどこが間違っているか知っている人はいますか?

4

5 に答える 5

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

この質問の修正を手伝ってくれた皆さんに感謝します。

于 2012-08-02T09:13:54.690 に答える
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

結果は?

于 2012-08-01T12:11:48.207 に答える
0

これで問題が解決しない場合がありますが、なぜRIGHT JOIN propertyですか?

LEFT JOIN property代わりに、より理にかなっています。

ご覧のとおり、transactionテーブルは既にこのクエリのベース テーブルであると想定LEFT JOINしています。unit_type

于 2012-08-01T12:12:53.920 に答える
0

その右結合は、その前の左結合のポイントを効果的に元に戻します

于 2012-08-01T12:15:37.813 に答える
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
于 2012-08-01T12:26:24.117 に答える