没有得到我想要的加入

时间:2014-06-16 08:12:28

标签: mysql sql join

我们正在为一个好的事业做一些专业的工作,而且我有一段时间的查询。许多志愿者多年来一直在进行编码,这是不可避免的结果。

我有两个表,A和B.我需要的是两个连接之间的score_hours的总和,其中数据对于每个仅A的实例是唯一的。

请记住,两个表都很大(每个10到50k +,具体取决于当月的时间)。

表A:

  • id(pk,ai)
  • uid(int)
  • scores_date(时间戳(但由于某种原因,只是实际日期,而不是。) 时间))
  • score_hours(小数3,1)

表B:

  • id(pk,ai)
  • uid(int)
  • shift_date(timestamp)

表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。

如果您需要更多数据,请告诉我。我可以提供所有。

1 个答案:

答案 0 :(得分:0)

您需要从您加入的表格中删除重复项,否则交叉产品会创建多行,并将其添加到总和中。

SELECT SUM(score_hours)
FROM A
JOIN (SELECT DISTINCT uid
      FROM B) AS B
ON A.uid = B.uid