嵌套的MySQL选择

时间:2015-09-10 21:03:42

标签: mysql

A有一个包含行的表,其中包含发票数据和这些行所属的人员数据。

这样的东西
name, birthday, sex, invoice_date, invoice_amount

首先,我想获得每个独特人物的所有数据集。所以我做了像这样的选择

SELECT * FROM data WHERE invoice_amount < 10 GROUP BY name, birthday

通过这个我过滤所有相同人的重复条目。

现在我想知道这些人中有多少是女性 - 不是所有行,而是分组结果。我的意思是我想从结果中做出选择(我不认为WHERE invoice_amount <10 AND sex = 1)。我该怎么做?

那么如何为该示例案例进行嵌套选择?

1 个答案:

答案 0 :(得分:1)

您始终可以使用子查询:

SELECT sex, count(*)
FROM (
  SELECT * FROM data WHERE invoice_amount < 10 GROUP BY name, birthday
) s
GROUP BY sex

但请注意,选择所有字段并不被视为良好做法,并且在不使用聚合函数的情况下按较少字段分组。我最好这样写你的查询:

SELECT sex, COUNT(DISTINCT name, birthday)
FROM data
WHERE invoice_amount < 10
GROUP BY sex

<强>更新

该表未规范化,因此可能会发生同一个人(同一个名字和同一个生日)在不同行上有不同的性别信息。

这里有两种选择。你可以忽略这个问题,大数据集中的一些错误不会(可能)产生很大的不同,所以你可以使用带有子查询的查询。

如果你SELECT *但只使用GROUP BY name, birthday,那么每个人只有一行,只有一个性别值(如果有多个值,那么你将得到的是不可预测的,但它在巨大的数据集上可以很好。)

但是如果你想确定哪些记录是错误的,你可以使用它:

SELECT name, birthday
FROM data
GROUP BY name, birthday
HAVING COUNT(DISTINCT sex)>1