2016-09-15 13 views
0

私のデータベースなしで2つのクエリに参加するには、両者がそれぞれの時間の価格 "の列のSUMを収集しようとしているいくつかの異なる値が、イムを持ってMySQLは試合

Wardrobe_CloakTable & Wardrobe_ServiceTable 

と呼ばれる2つの異なるテーブルで存在します。

このクエリは私にちょうどWardrobe_CloakTable

SELECT DATE(delivered) as date, sum(price) as sum, HOUR(delivered) AS hour 
      FROM Wardrobe_CloakTable 
     WHERE payingcustomerID = '$payingcustomerID' 
      AND delivered >= CONCAT(CURDATE() , ' 07:00:00') 
      AND delivered < CONCAT(CURDATE() , ' 07:00:00') + INTERVAL 1 DAY 
     GROUP BY DATE(delivered), HOUR(delivered) 

これに対して正しい結果を与えるには、私がやりたいものを実際にデータが存在するので、唯一の時間は、ある

--------------------------------- 
| date | sum | hour  | 
| 2016-09-15 | 100 | 9  | 
| 2016-09-15 | 200 | 10  | 
| 2016-09-15 | 100 | 12  | 
| 2016-09-15 | 100 | 18  | 
--------------------------------- 

のようなものを提供します

----------------------------------------------------------------- 
| date | sum(CloakTable) | sum(ServiceTable) | hour  | 
| 2016-09-15 | 100    | 200    | 9  | 
| 2016-09-15 | 200    | 500    | 10  | 
| 2016-09-15 |     | 400    | 11  | 
| 2016-09-15 | 200    |     | 14  | 
| 2016-09-15 | 100    | 400    | 15  | 
| 2016-09-15 | 100    | 200    | 18  | 
------------------------------------------------------------------ 

これまでのところ、私はUNIONを使用して作成しようとしていますとFULL JOINですが、私が気づいたように、完全な結合はMySQLでは不可能です。あなたが左をしない限り、右。

iは便利なものになってきた最も近い:

SELECT DATE(delivered) as date, 
    sum(price) as sum, 
    HOUR(delivered) as hour 

      FROM Wardrobe_CloakTable 
      WHERE payingcustomerID = 2 
      AND Wardrobe_CloakTable.delivered >= CONCAT(CURDATE() , ' 07:00:00') 
      AND Wardrobe_CloakTable.delivered < CONCAT(CURDATE() , ' 07:00:00') + INTERVAL 1 DAY 
      GROUP BY DATE(delivered), HOUR(delivered) 
    UNION ALL 
SELECT DATE(time) as date, 
    sum(price) as sum, 
    HOUR(time) as hour 
    FROM Wardrobe_ServiceTable   
     WHERE payingcustomerID = 2 
     AND Wardrobe_ServiceTable.time >= CONCAT(CURDATE() , ' 07:00:00') 
     AND Wardrobe_ServiceTable.time < CONCAT(CURDATE() , ' 07:00:00') + INTERVAL 1 DAY 
     GROUP BY DATE(time), HOUR(time) 

これは私に与える:

--------------------------------- 
| date | sum | hour  | 
| 2016-09-15 | 100 | 9  | (Cloaktable) 
| 2016-09-15 | 200 | 10  | (Cloaktable) 
| 2016-09-15 | 100 | 9  | (service) 
| 2016-09-15 | 100 | 11  | (service) 
--------------------------------- 

スキーマ

CREATE TABLE `Wardrobe_CloakTable` (
    `ID` int(64) NOT NULL, 
    `payingcustomerID` int(11) NOT NULL, 
    `deviceID` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, 
    `terminalnumber` int(11) NOT NULL, 
    `qrcode` varchar(64) CHARACTER SET latin1 COLLATE latin1_danish_ci NOT NULL, 
    `cloakroomsection` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL, 
    `cloakroomnumber` int(11) NOT NULL, 
    `isbag` tinyint(1) NOT NULL, 
    `price` int(11) NOT NULL, 
    `delivered` datetime NOT NULL, 
    `collected` datetime DEFAULT NULL, 
    `reservedtime` datetime DEFAULT CURRENT_TIMESTAMP 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 


CREATE TABLE `Wardrobe_ServiceTable` (
    `ID` int(11) NOT NULL, 
    `payingcustomerID` int(11) NOT NULL, 
    `qrcode` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, 
    `time` datetime NOT NULL, 
    `price` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 
+1

私はあなたが/ Wardrobe_CloakTable.date = Wardrobe_ServiceTable.date ON '条件によってそれらを結合したいことができると思うとWardrobe_CloakTable.hour = Wardrobe_ServiceTable.hour'。 –

+0

データテーブルのスキーマを追加できますか? –

+0

もし私がphpmyadminで簡単にそれを得る方法を知っていたら?そこに助けてもらえますか? –

答えて

1

ソニー、

を私が作業を得ました要求。 100%確実ではない、それはそれを処理するための最良の方法ですが、少なくとも、それが働いている:

SELECT date_buy, hour_buy, sum(sum_cloak) AS `sum(CloakTable)`, sum(sum_service) AS `sum(ServiceTable)` FROM (
    SELECT DATE(wct.delivered) as date_buy, HOUR(wct.delivered) AS hour_buy, sum(wct.price) AS sum_cloak, 0 as sum_service FROM Wardrobe_CloakTable wct 
    WHERE wct.payingcustomerID = 2 
     AND wct.delivered >= CONCAT(CURDATE(), ' 07:00:00') 
     AND wct.delivered < CONCAT(CURDATE(), ' 07:00:00') + INTERVAL 1 DAY 
    GROUP BY date_buy, hour_buy 

    UNION ALL 

    SELECT DATE(wst.time) as date_buy, HOUR(wst.time) AS hour_buy, 0 AS sum_cloak, sum(wst.price) as sum_service 
    FROM Wardrobe_ServiceTable wst 
    WHERE wst.payingcustomerID = 2 
     AND wst.time >= CONCAT(CURDATE(), ' 07:00:00') 
     AND wst.time < CONCAT(CURDATE(), ' 07:00:00') + INTERVAL 1 DAY 
    GROUP BY date_buy, hour_buy 
) fullTab 
GROUP BY date_buy, hour_buy 
+0

実際に働いています! 2番目のステートメントはwst.deliveredの代わりにwst.timeでなければなりません。私はすでに十分な時間を使用しているので、これに固執します..しかしTHX! –

+0

申し訳ありませんが、私はあなたの輸出前に私のテストの列を作ったように異なる列の名前に気付かなかった!私は編集をした –