0

これは私の質問です、

    SELECT 
    COUNT(a.ref) AS refoct2015,
    COUNT(b.ref) AS refspet2015,
    COUNT(c.ref) AS refoct2014,
    port_ID
FROM
    report AS a
        JOIN
    report_sept2015 AS b USING (port_ID)
        JOIN
    report_oct2014 AS c USING (port_ID)
GROUP BY port_ID , a.booking_date , b.booking_date , c.booking_date

しかし、SQLが動作を停止しない場合、結果が得られるまでに15分以上かかります。何度も再起動し、読み取り時間を変更しました([編集]> [設定]>など)が、まだ非常に遅いものはありません

4

1 に答える 1

0

結合が発生する前にカウントが必要な場合は、結合する前にカウントを生成する必要があります。

これは、それを達成するための 1 つの方法です。

SELECT A.Port_ID, A.refoct2015, B.refSept2015 , C.RefOct2014 
FROM (SELECT Port_ID, Booking_Date, count(Ref) as refoct2015 
      FROM report
      GROUP BY Port_Id, Booking_Date) A
INNER JOIN 
     (SELECT Port_ID, Booking_Date, count(Ref) as refSept2015 
      FROM Report_sept2015
      GROUP BY Port_Id, Booking_Date) B 
  ON A.Port_ID = B.Port_ID
INNER JOIN 
     (SELECT Port_ID, Booking_Date, count(Ref) as RefOct2014 
      FROM report_oct2014
      GROUP BY Port_Id, Booking_Date) C 
  ON B.Port_ID = C.Port_ID

Booking_dateを含めて参加しないのは奇妙に思えますが...

テーブル A に 100 個の異なる日付があり、テーブル B に 100 個の異なる日付があり、テーブル c に 100 個の異なる日付がある場合、それぞれが同じ port_Id を共有すると仮定すると、結果セットは 100*100*100 になります...おそらくなぜ 15 を取るのか分...確かに、結合を逃していませんか?

これは私にはもっと理にかなっているようです...

SELECT A.Port_ID, A.refoct2015, B.refSept2015 , C.RefOct2014 
FROM (SELECT Port_ID, Booking_Date, count(Ref) as refoct2015 
      FROM report
      GROUP BY Port_Id, Booking_Date) A
INNER JOIN 
     (SELECT Port_ID, Booking_Date, count(Ref) as refSept2015 
      FROM Report_sept2015
      GROUP BY Port_Id, Booking_Date) B 
  ON A.Port_ID = B.Port_ID
 and A.Booking_date= B.Booking_date
INNER JOIN 
     (SELECT Port_ID, Booking_Date, count(Ref) as RefOct2014 
      FROM report_oct2014
      GROUP BY Port_Id, Booking_Date) C 
  ON B.Port_ID = C.Port_ID
 and A.Booking_date= B.Booking_date

ただし、これは、日付とポート ID がすべてのテーブルにない場合、問題が発生することを意味します。内部結合によるデータ消去あり。通常、これを解決するには完全外部結合を使用しますが、mySQL はサポートしていません。動作をシミュレートするには、外部結合とユニオンを使用する必要があります。

だから、あなたが求めているものを推測し続けるのではなく. これらのテーブルの目的と達成しようとしていることを平易な英語で説明してください。元の質問を編集して編集します。

ここでXY問題に陥っているのではないかと心配しています

選択されていない場合、booking_date が関連するのはなぜですか?

これらの 3 つのテーブルのデータを日付でピボットしようとしているようですが、日付は表示されません....

あなたは次のようなものを求めていますか

Port_Id   Date    Oct2015  Sept2015  Oct2014
1        1/1/2015     500       250        0
1        1/2/2015     100        60        0
2        1/1/2015     100       540       60

?

于 2015-10-23T13:54:08.413 に答える