MySQL:仅加入单行

时间:2015-05-15 14:56:38

标签: mysql sql

我有一张表data看起来像这样

idOne | date | input
------------------
1 | 2015-01-01 | 423
2 | 2015-01-01 | 342
1 | 2015-01-02 | 343
2 | 2015-01-02 | 332

在这张桌子上我做了:

SELECT date, SUM(input)
FROM data
WHERE date BETWEEN "2015-01-01" AND "2015-01-02"
GROUP BY date

这给了我这个输出:

date | input
------------------
2015-01-01 | 765
2015-01-02 | 675

我的数据库中还有一个表info

idTwo | idOne | label
------------------
1 | 1 | 'Hello, '
2 | 2 | 'World!'
3 | 1 | 'Hello, '
4 | 2 | 'World!'

正如您所看到的,这个数据库没有完全规范化,但这就是我所拥有的。

我想按label语句中的SELECT值进行过滤。这令我头疼!每次我尝试我的行都会多次相加。例如:

SELECT date, SUM(input)
FROM data, info
WHERE date BETWEEN "2015-01-01" AND "2015-01-02"
AND data.idOne = info.idOne
AND label = 'Hello,'
GROUP BY date

两次求和,并给出了这个输出:

date | input
------------------
2015-01-01 | 1530
2015-01-02 | 1350

我该如何解决这个问题?感谢。

4 个答案:

答案 0 :(得分:1)

如果您想要第一张表中的准确总和,那么您可能需要exists

SELECT date, SUM(input)
FROM data d
WHERE date BETWEEN '2015-01-01' AND '2015-01-02' AND
      EXISTS (SELECT 1 FROM info i WHERE d.idOne = i.idOne AND i.label = 'Hello,')
GROUP BY date;

您还应学习使用显式join语法。简单规则:切勿在{{1​​}}子句中使用逗号。

答案 1 :(得分:0)

总和加倍,如您所料,因为行连接了两次,因为id在第二个表中出现两次。

您需要做的是从第二个表中提取该ID,使其显示一次。您必须决定是否要在第二个表中使用id最高或最低的行,但如果您想要max,请尝试以下操作:

SELECT MAX(idTwo), idOne, label
FROM info
GROUP BY idOne, label;

然后,因为每个idOne只有一行(希望如此。这不能保证,因为你的表没有像你说的那样进行规范化),你可以将它加入数据并获得你想要的信息:

SELECT dateCol, SUM(input)
FROM data
JOIN(
  SELECT MAX(idTwo), idOne, label
  FROM info
  GROUP BY idOne, label) tmp ON data.idOne = tmp.idOne
GROUP BY data.idOne;

以下是SQL Fiddle示例。

答案 2 :(得分:-1)

你是说这个意思吗?

SELECT date, SUM(input) FROM data
WHERE date BETWEEN "2015-01-01" AND "2015-01-02"
AND idOne in (SELECT idtwo FROM info where label = 'Hello,')
GROUP BY date

答案 3 :(得分:-1)

SELECT date, SUM(input)
FROM data, (select distinct idOne from info where label = 'Hello') as info
WHERE date BETWEEN "2015-01-01" AND "2015-01-02"
AND data.idOne = info.idOne
GROUP BY date