我们正在为一个好的事业做一些专业的工作,而且我有一段时间的查询。许多志愿者多年来一直在进行编码,这是不可避免的结果。
我有两个表,A和B.我需要的是两个连接之间的score_hours的总和,其中数据对于每个仅A的实例是唯一的。
请记住,两个表都很大(每个10到50k +,具体取决于当月的时间)。
表A:
表B:
表B中有许多记录包含我们在几个日期寻找的uid(日期不是唯一的)。表A有多个uid记录,但在不同的日期。所以每天可以有1个uid,但不是每天1个uid的2个实例。
这两个表显然有更多的选择器,但它们在表之间没有任何匹配(尽管我需要用简单的" AND"来查询它们)所以这就是我的意思必须与之合作。由于查询的其余部分,我确实需要加入它们,但到目前为止,我还没有在合适的时间内获得我需要的记录。
我的尝试是:
这几乎成功了。但执行时间令人作呕,并且由于一些简单的选择器而失败了。
SELECT SUM(score_hours)
FROM A
WHERE
A.uid IN
(SELECT B.uid
FROM B
WHERE B.uid = "1")
这给出了正确的输出,但它为每个uid实例加入一个。通常你可以通过分组来解决这个问题,但总和仍然会计算所有。所以这不是一个选择:
SELECT SUM(score_hours)
FROM A
LEFT JOIN B ON A.uid = B.uid
WHERE A.uid = "1"
*编辑:我不仅需要在uid上加入,而且还必须有这样的内容:
DISTINCT(date(m.shift_datum)) = DATE(d.dagscores_date)
它实际上是一个非常基本的查询,除了在记录上需要SUM,这对于Left连接不是唯一的,并且我需要同时在两个表上JOIN。
如果您需要更多数据,请告诉我。我可以提供所有。
答案 0 :(得分:0)
您需要从您加入的表格中删除重复项,否则交叉产品会创建多行,并将其添加到总和中。
SELECT SUM(score_hours)
FROM A
JOIN (SELECT DISTINCT uid
FROM B) AS B
ON A.uid = B.uid