【问题标题】:[Mysql]: select UNIQUE w/ join[Mysql]:选择 UNIQUE w/join
【发布时间】:2011-01-02 15:06:35
【问题描述】:

我有一系列相关的表格。

Transaction_Type
Transaction_ID(主要)
交易金额
交易类型

交易
Transaction_ID(主要)
时间戳

购买
交易 ID
Item_ID Purchase_ID(主要)

物品
Item_ID
Client_ID

我需要根据时间戳和 client_id 选择 transaction_type 行

我的查询如下:

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

问题:

如果客户在一笔交易中购买了多件商品 - 一个 transaction_id 将在 Purchase 表中有多行。因此,该联接正在为购买多行的 transaction_id 重复 transaction_amount。

有没有办法将UNIQUE 应用于此查询的购买行?

还有其他方法可以绕过购买的多行吗?

或者我是否需要重新评估我的数据库架构?

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

【问题讨论】:

  • 一个非常相似 - 是的。但那是为了诊断问题——这是更具体的。如果我应该坚持这个问题,我可以毫无问题地结束这个问题。
  • 我想你想做一个 PIVOT 但我不确定 mysql 是否支持它

标签: mysql join


【解决方案1】:

使用子查询。

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)

【讨论】:

  • 谢谢!在子查询的第一个 JOIN 中,它需要是 t.transaction_id 而不是 tt.transaction_id
【解决方案2】:

需要使用inner select,类似这样:

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')

【讨论】:

  • 这也是一个合法的解决方案
【解决方案3】:

我认为您必须使用子查询 - 一个带有函数 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

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

【讨论】:

    【解决方案4】:

    您可以按 Transaction_ID 和 Transaction_amount 对结果进行分组,然后对其进行全局总和。

    select sum(Transaction_amount) from
    (select Transaction_ID, Transaction_amount
    from [...]
    group by Transaction_ID, Transaction_amount) a
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 2018-08-27
      • 2017-11-01
      • 2013-05-18
      • 2022-10-24
      • 2012-07-15
      • 2012-04-29
      相关资源
      最近更新 更多