[Mysql]:选择唯一w/join

[Mysql]:选择唯一w/join,mysql,join,Mysql,Join,我有一系列相关的表格 交易类型 事务ID主 交易金额 交易类型 交易 事务ID主 时间戳 购买 事务处理ID 项目编号 采购标识主 项目 项目编号 客户识别码 我需要根据时间戳和客户端id选择事务类型行 我的质询如下: SELECT SUM(tt.Transaction_Amount) FROM ItemTracker_dbo.Transaction_Type tt JOIN ItemTracker_dbo.Transaction t ON tt

我有一系列相关的表格

交易类型 事务ID主 交易金额 交易类型

交易 事务ID主 时间戳

购买 事务处理ID 项目编号 采购标识主

项目 项目编号 客户识别码

我需要根据时间戳和客户端id选择事务类型行

我的质询如下:

SELECT 
    SUM(tt.Transaction_Amount)
FROM 
    ItemTracker_dbo.Transaction_Type tt
JOIN    
    ItemTracker_dbo.Transaction t
   ON
    tt.Transaction_ID = t.Transaction_ID
JOIN
    ItemTracker_dbo.Purchase p
   ON
    p.Transaction_ID = tt.Transaction_ID
JOIN
    ItemTracker_dbo.Item i
   ON
    i.Item_ID = p.Item_ID
WHERE
    t.TimeStamp >= $start AND t.TimeStamp <= $end
   AND
    tt.Transaction_Format IN ('cash', 'credit')
   AND
    i.Client_ID = $client_ID
问题是:

如果客户在一个事务中购买了多个项目,则一个事务id在采购表中将有多行。因此,联接正在重复购买中有多行的交易id的交易金额

对于此查询,是否有方法将UNIQUE应用于purchase中的行

有没有其他方法可以绕过购买中的多行

还是需要重新评估数据库的体系结构


如果有任何其他信息对您有帮助,请告诉我。

我认为您必须使用子查询-一个具有函数sum的子查询和一个具有DISTINCT的嵌套查询

SELECT SUM(Transaction_Amount) 
FROM (
   SELECT DISTINCT
       tt.Transaction_Amount, t.Transaction_ID
   FROM 
       ItemTracker_dbo.Transaction_Type tt
   JOIN    
       ItemTracker_dbo.Transaction t
      ON
       tt.Transaction_ID = t.Transaction_ID
   JOIN
       ItemTracker_dbo.Purchase p
      ON
       p.Transaction_ID = tt.Transaction_ID
   JOIN
       ItemTracker_dbo.Item i
      ON
       i.Item_ID = p.Item_ID
   WHERE
       t.TimeStamp >= $start AND t.TimeStamp <= $end
      AND
       tt.Transaction_Format IN ('cash', 'credit')
      AND
       i.Client_ID = $client_ID
) table

我希望我理解你的问题。如果没有,请原谅误解

您可以按交易ID和交易金额对结果进行分组,然后取其全局总和

select sum(Transaction_amount) from
(select Transaction_ID, Transaction_amount
from [...]
group by Transaction_ID, Transaction_amount) a
使用子查询

SELECT SUM(tt.Transaction_Amount)
FROM ItemTracker_dbo.Transaction_Type tt
WHERE tt.Transaction_ID IN 
(SELECT t.Transaction_ID FROM
        ItemTracker_dbo.Transaction t
    JOIN
        ItemTracker_dbo.Purchase p
       ON
        p.Transaction_ID = t.Transaction_ID
    JOIN
        ItemTracker_dbo.Item i
       ON
        i.Item_ID = p.Item_ID
    WHERE
        t.TimeStamp >= $start AND t.TimeStamp <= $end
       AND
        tt.Transaction_Format IN ('cash', 'credit')
       AND
        i.Client_ID = $client_ID)

需要使用内部选择,如下所示:

select sum(tt.Transaction_Amount)
from ItemTracker_dbo.Transaction_Type tt
inner join ItemTracker_dbo.Transaction t ON tt.Transaction_ID = t.Transaction_ID
inner join
(select distinct(transaction_id) as transID
from Purchase as P
inner join Item as I on P.Item_ID = I.Item_ID
where I.Client_ID = $client_ID) blah
on t.Transaction_ID = blah.transID
t.TimeStamp >= $start AND t.TimeStamp <= $end
   AND
    tt.Transaction_Format IN ('cash', 'credit')

一个非常相似的——是的。但这是为了诊断问题——这是更具体的问题。如果我坚持这个问题,我就可以结束这个问题。我想你想做一个PIVOT,但我不确定mysql是否支持iThanks!在子查询的第一个连接中,它需要是t.transaction\u id而不是tt.transaction\u id这也是一个合法的解决方案