这是我的查询,
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没有停止工作时,sql需要超过15分钟的时间给我一个结果。 我重启了很多次,改变了阅读时间(编辑>偏好>等等)但是没有什么比这更慢了
答案 0 :(得分:0)
如果在加入之前需要计数,则必须在加入之前生成计数。
这是实现这一目标的一种方法:
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个不同的日期,那么你的结果集将是100 * 100 * 100假设每个共享相同的port_Id ...可能为什么花了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不在所有表中,那么您就会遇到问题。由于内部连接而导致数据消除。通常我会使用Full外连接来解决这个问题,但mySQL不支持它。您必须使用外部联接和联合来模拟行为。
所以不要继续猜测你的目标。解释这些表格的用途,以及用简单的英语完成的工作。通过编辑原始问题。
我担心我们会陷入XY problem here
如果不在选择中,为什么booking_date相关?
看起来您似乎想要按日期从这三个表中转移数据......但后来没有显示日期....
你是否喜欢
之类的东西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