[Mysql]: выберите UNIQUE w / join - PullRequest
0 голосов
/ 07 января 2010

У меня есть ряд связанных таблиц.

Transaction_Type
Transaction_ID (основной)
TRANSACTION_AMOUNT
Transaction_Type

Сделка
Transaction_ID (основной)
Отметка

Покупка
TRANSACTION_ID
iTEM_ID Идентификатор_покупки (основной)

Пункт
ITEM_ID
CLIENT_ID

Мне нужно выбрать строки транзакции на основе метки времени и client_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

Выпуск:

Если покупатель покупает более одной позиции в транзакции - для идентификатора транзакции в таблице «Покупка» будет указано несколько строк. Таким образом, соединение повторяет транзакцию транзакции для идентификатора транзакции, у которого в покупке несколько строк.

Есть ли способ применить UNIQUE к строкам покупки для этого запроса?

Есть ли другой способ обойти несколько рядов при покупке?

Или мне нужно пересмотреть архитектуру моей базы данных?

Если вам понадобится дополнительная информация, пожалуйста, дайте мне знать.

Ответы [ 4 ]

1 голос
/ 07 января 2010

Нужно использовать внутреннее выделение, как-то так:

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')
1 голос
/ 07 января 2010

Используйте подзапрос.

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)
0 голосов
/ 07 января 2010

Вы можете сгруппировать свои результаты по Transaction_ID и Transaction_amount, а затем взять глобальную сумму этого.

select sum(Transaction_amount) from
(select Transaction_ID, Transaction_amount
from [...]
group by Transaction_ID, Transaction_amount) a
0 голосов
/ 07 января 2010

Я думаю, что вы должны использовать подзапрос - один с функцией 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

Я надеюсь, что понял ваш вопрос. Если нет, то извините за недоразумение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...