MySQL-Group和total,但返回每个组中的所有行

MySQL-Group和total,但返回每个组中的所有行,mysql,Mysql,我正在尝试编写一个查询,每次在特定日期范围内,同一个人出现在我的表中时都会找到该查询。然后,它将这个人分组,并对他们在特定范围内的支出进行合计。如果他们的消费习惯大于X金额,则返回指定日期范围内此人的每一行。不仅仅是分组的总金额。这就是我到目前为止所做的: SELECT member_id, SUM(amount) AS total FROM `sold_items` GROUP BY member_id HAVING total > 50 这是检索正确的总数并返回花费超过50美

我正在尝试编写一个查询,每次在特定日期范围内,同一个人出现在我的表中时都会找到该查询。然后,它将这个人分组,并对他们在特定范围内的支出进行合计。如果他们的消费习惯大于X金额,则返回指定日期范围内此人的每一行。不仅仅是分组的总金额。这就是我到目前为止所做的:

SELECT member_id, 
SUM(amount) AS total 
FROM `sold_items` 
GROUP BY member_id 
HAVING total > 50

这是检索正确的总数并返回花费超过50美元的成员,但不是每行。只是每个成员的总数和他们的总数。我目前正在查询整个表,我还没有添加日期范围。

有几个语法将得到您正在查找的结果,下面是一个使用内部联接的语法,以确保返回的所有行在group by返回的列表中都有一个成员id,并且对某个成员的每个行重复合计:

SELECT si.*, gb.total from sold_items as si, (SELECT member_id as mid, 
SUM(amount) AS total 
FROM `sold_items` 
GROUP BY member_id 
HAVING total > 50) as gb where gb.mid=si.member_id;

JOIN
此子查询与原始表:

SELECT si1.*
FROM sold_items AS si1
JOIN (SELECT member_id
      FROM sold_items
      GROUP BY member_id
      HAVING SUM(amount) > 50) AS si2
ON si1.member_id = si2.member_id
一般规则是,子查询按其选择的相同列分组,然后使用相同的列将其与原始查询联接

SELECT member_id, amount
FROM sold_items si
INNER JOIN (SELECT member_id, 
SUM(amount) AS total 
FROM `sold_items` 
GROUP BY member_id 
HAVING total > 50) spenders USING (member_id)
已经生成的查询可以用作要联接的临时表。如果member_id不是表上的索引,则此操作将随着缩放而变慢。
单词spenders是一个表别名,您可以使用任何有效的别名来代替它。

我认为这可能会有所帮助:

SELECT 
    member_id, 
    SUM(amount) AS amount_value,
    'TOTAL' as amount_type
FROM 
    `sold_items` 
GROUP BY 
    member_id 
HAVING 
    SUM(amount) > 50

UNION ALL

SELECT 
    member_id,
    amount AS amount_value,
    'DETAILED' as amount_type
FROM 
    `sold_items` 
    INNER JOIN
    (
        SELECT 
            A.member_id, 
            SUM(amount) AS total 
        FROM 
            `sold_items` A 
        GROUP BY 
            member_id 
        HAVING 
            total <= 50
    ) AS A
    ON `sold_items`.member_id = A.member_id 

因此,
amount\u type
列将区分两个特定的成员组

您可以使用
EXISTS
进行子查询:

select *
from sold_items t1
where exists (
    select * from sold_items t2
    where t1.member_id=t2.member_id
    group by member_id
    having sum(amount)>50
)

参考:

不可能。当您
分组时
,该组的所有成员行都会向下折叠为一个代表行。如果需要原始成员行,则不能使用
分组依据
。同意。这是您希望在查询上有一个应用程序层,以提供报表所需的小计和明细表。您可以
将此子查询与原始表连接起来
以返回所有相关行。我可以使用SQL Server中的over()函数实现此结果,不确定mySQL中是否有类似的东西。我正在用PHP编写我的后端。我考虑将超过X amount的成员返回到我的PHP模型中,然后使用IN运行第二个查询,并编写一个循环来包含第一个查询中找到的所有成员。这是糟糕的做法吗?请不要在答案中使用隐式连接。我们试图促进ANSI加入。我的道歉是有道理的。这似乎解决了我的问题!谢谢我从来都不知道我可以用连接编写这样的嵌套select语句。非常棒。它不工作,它不会为我返回所有Resultl:查询应该返回重复的结果(相同的设备和相同的时间),但它会错过2个以上实例的重复结果。您的子查询不正确。它只是从每个组中选择一个ID,而不是所有ID。您需要选择要分组的相同列,然后在联接中使用这些列。@Sing3如果原因是因为您的版本错误,则不应进行向下投票。好的,感谢您的解释,很抱歉进行向下投票:)
select *
from sold_items t1
where exists (
    select * from sold_items t2
    where t1.member_id=t2.member_id
    group by member_id
    having sum(amount)>50
)