-1

これは 3 つのテーブルを結合する MySQL クエリですが、jobtitle テーブルの結果のみが正しく出力され、他の 2 つの結果は誤って重複しています。

SELECT `booking`.`receipt_no`, `client`, `operator`, `discount`, `total_amount`, `amount_paid`, `balance`, `date`, `jobtitle`, `quantity`, `amount`, `date_paid`, `old_balance`, `debtor_amount_paid`, `new_balance`
FROM (`booking`)
JOIN `jobtitle` ON `jobtitle`.`bookingID` = `booking`.`bookingID`
JOIN `first_graphics_debtors` ON `first_graphics_debtors`.`receipt_no` = `booking`.`receipt_no`
WHERE `booking`.`receipt_no` =  '753263343'
AND `first_graphics_debtors`.`receipt_no` =  '753263343'
GROUP BY `jobtitle`.`quantity`

どうすればこれを修正できますか?

3 つのテーブルのスキーマ。

予約

CREATE TABLE `booking` (
`bookingID` int(11) NOT NULL AUTO_INCREMENT,
`receipt_no` int(11) NOT NULL,
`client` varchar(32) NOT NULL,
`operator` varchar(32) NOT NULL,
`discount` int(11) NOT NULL,
`total_amount` int(64) NOT NULL,
`amount_paid` int(32) NOT NULL,
`balance` int(32) NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`bookingID`)
ENGINE=InnoDB AUTO_INCREMENT=209 DEFAULT CHARSET=latin1

職名

CREATE TABLE `jobtitle` (
`jobtitleID` int(11) NOT NULL AUTO_INCREMENT,
`jobtitle` varchar(255) NOT NULL,
`quantity` int(11) NOT NULL,
`amount` varchar(255) NOT NULL,
`jobtypeID` int(11) NOT NULL,
`bookingID` int(11) NOT NULL,
PRIMARY KEY (`jobtitleID`)
ENGINE=InnoDB AUTO_INCREMENT=463 DEFAULT CHARSET=latin1

First_graphics_debtors

CREATE TABLE `first_graphics_debtors`
`id` int(11) NOT NULL AUTO_INCREMENT,
`receipt_no` int(11) NOT NULL,
`date_paid` date NOT NULL,
`old_balance` int(32) NOT NULL,
`debtor_amount_paid` int(32) NOT NULL,
`new_balance` int(32) NOT NULL,
PRIMARY KEY (`id`)
ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1

いくつかのデータを挿入した後

予約

+-----------+------------+----------+----------+----------+--------------+-------------+---------+------------+
    | bookingID | receipt_no | client   | operator | discount | total_amount | amount_paid | balance | date       |
    +-----------+------------+----------+----------+----------+--------------+-------------+---------+------------+
    |       205 |  156872940 | Osaro    | Obi      |       10 |       156380 |      135000 |    5742 | 2012-05-15 |
    |       206 |  227349168 | Amaka    | Stephen  |        4 |        73250 |       70320 |       0 | 2012-05-15 |
    |       207 |  155732278 | Aghahowa | Ibori    |        0 |       116836 |       15000 |  101836 | 2012-05-15 |
    |       208 |  753263343 | Chaka    | Stephen  |       10 |       231290 |       56000 |  152161 | 2012-05-15 |
    +-----------+------------+----------+----------+----------+--------------+-------------+---------+------------+

職名

+------------+---------------------------+----------+--------+-----------+-----------+
| jobtitleID | jobtitle                  | quantity | amount | jobtypeID | bookingID |
+------------+---------------------------+----------+--------+-----------+-----------+
|        454 | A1 Full Colour            |       10 | 4334   |         1 |       205 |
|        455 | Complementry Card         |       20 | 5652   |         2 |       205 |
|        456 | A4 Printout (graphics)B/W |       25 | 2930   |         4 |       206 |
|        457 | Scan                      |        2 | 4334   |         5 |       207 |
|        458 | A4 Full Colour            |      199 | 500    |         3 |       207 |
|        459 | ID Card                   |        2 | 4334   |         2 |       207 |
|        460 | A3 Full Colour            |       10 | 4334   |         3 |       208 |
|        461 | Flex Banner               |       20 | 2930   |         2 |       208 |
|        462 | A2 Single Colour          |      199 | 650    |         1 |       208 |
+------------+---------------------------+----------+--------+-----------+-----------+

First_graphics_debtors

+----+------------+------------+-------------+--------------------+-------------+
| id | receipt_no | date_paid  | old_balance | debtor_amount_paid | new_balance |
+----+------------+------------+-------------+--------------------+-------------+
|  7 |  156872940 | 2012-05-15 |        5742 |               5000 |         742 |
|  8 |  156872940 | 2012-05-15 |        5742 |               5742 |           0 |
|  9 |  753263343 | 2012-05-15 |      152161 |             152161 |           0 |
| 13 |  753263343 | 2012-05-15 |      152161 |              14524 |      137637 |
| 14 |  753263343 | 2012-05-15 |      152161 |               2000 |      150161 |
| 15 |  753263343 | 2012-05-15 |      152161 |               1000 |      151161 |
+----+------------+------------+-------------+--------------------+-------------+

上記のクエリを実行すると、次の出力が得られます。

+------------+--------+----------+----------+--------------+-------------+---------+------------+------------------+----------+--------+------------+-------------+--------------------+-------------+
| receipt_no | client | operator | discount | total_amount | amount_paid | balance | date       | jobtitle         | quantity | amount | date_paid  | old_balance | debtor_amount_paid | new_balance |
+------------+--------+----------+----------+--------------+-------------+---------+------------+------------------+----------+--------+------------+-------------+--------------------+-------------+
|  753263343 | Chaka  | Stephen  |       10 |       231290 |       56000 |  152161 | 2012-05-15 | A3 Full Colour   |       10 | 4334   | 2012-05-15 |      152161 |             152161 |           0 |
|  753263343 | Chaka  | Stephen  |       10 |       231290 |       56000 |  152161 | 2012-05-15 | Flex Banner      |       20 | 2930   | 2012-05-15 |      152161 |             152161 |           0 |
|  753263343 | Chaka  | Stephen  |       10 |       231290 |       56000 |  152161 | 2012-05-15 | A2 Single Colour |      199 | 650    | 2012-05-15 |      152161 |             152161 |           0 |
+------------+--------+----------+----------+--------------+-------------+---------+------------+------------------+----------+--------+------------+-------------+--------------------+-------------+

下の列のデータは、recipient_no に関連する 4 つの行からデータを取得する代わりに、3 回繰り返されます。

    date_paid, old_balance, debtor_amount_paid, new_balance
4

1 に答える 1

0

これを修正するには、GROUP BY 句を削除します。GROUP BY を使用して重複する行が返されないようにする場合は、GROUP BY 句の SELECT リストにすべての式を含めます。

SELECT `booking`.`receipt_no`, `client`, `operator`, `discount`, `total_amount`, `amount_paid`, `balance`, `date`, `jobtitle`, `quantity`, `amount`, `date_paid`, `old_balance`, `debtor_amount_paid`, `new_balance`
FROM (`booking`)
JOIN `jobtitle` ON `jobtitle`.`bookingID` = `booking`.`bookingID`
JOIN `first_graphics_debtors` ON `first_graphics_debtors`.`receipt_no` = `booking`.`receipt_no`
WHERE `booking`.`receipt_no` =  '753263343'
AND `first_graphics_debtors`.`receipt_no` =  '753263343'
GROUP BY `booking`.`receipt_no`, `client`, `operator`, `discount`, `total_amount`, `amount_paid`, `balance`, `date`, `jobtitle`, `quantity`, `amount`, `date_paid`, `old_balance`, `debtor_amount_paid`, `new_balance`

MySQL には、GROUP BY 句から非集計を省略できる機能があります。この機能を無効にして、MySQL を他のリレーショナル データベースのように動作させるには:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

【追記】

「これを修正するにはどうすればよいですか」と尋ねられますが、返されると予想される結果セットが明確に示されていません。

結合されたテーブル間に 1 対多の関係がある場合、いくつかの「重複」が返されることを完全に想定しています。

たとえば、orderテーブルとline_itemテーブルがあり、注文には の関連する行が 0 個または 1 個以上ある可能性がありますline_itemが、aline_itemは 1 個に関連付けられているとしorderます。次のようなクエリを実行すると:

SELECT o.id, l.id
  FROM orders o
  JOIN line_item l ON l.order_id = o.id

複数の line_item が関連付けられているすべての注文に対して、o.id の「重複した」値が返されることを期待しています。

この問題は、結合述語として「receipt_no」を使用していると強く思われます。通常、結合述語は次の形式です。 child_table.parent_key = parent_table.key

各テーブルから主キーの値を取得するクエリを実行することをお勧めします

SELECT b.bookingID
     , j.ID
     , d.ID
  FROM booking b
  JOIN jobtitle j ON j.bookingID = b.bookingID
  JOIN first_graphics_debtors d ON d.receipt_no = b.receipt_no
 WHERE b.receipt_no = '753263343'
ORDER BY 1,2,3

これにより、「重複」を取得している場所が表示されます。スキーマ定義といくつかのサンプル データがなければ、これだけで説明できます。

于 2012-05-16T22:02:50.217 に答える