MySQL JOIN и DATE сравнение / манипулирование - PullRequest
2 голосов
/ 10 октября 2011

Рассмотрим следующие таблицы MySQL:

ПРИЛОЖЕНИЯ (содержит все приложения всех пользователей)

unique_id |  user_id  |  date_of_application  |  date_ended  | status
----------------------------------------------------------------------------
1            user_a          2010-09-09          2010-12-24     Ended
2            user_a          2011-03-03          2011-06-06     Ended
3            user_a          2011-08-08          2011-10-10     Ended
4            user_b          2011-10-01                         Active

* ITEM_TRANSACTIONS * (содержит все транзакции элемента всеми пользователями)

user_id |  item_id  |  quantity_ordered  |  date_requested  |  date_received
----------------------------------------------------------------------------
user_a      item_a            20              2011-10-01         2011-10-02
user_a      item_b            10              2011-10-01         2011-10-02
user_b      item_a            30              2011-10-05         2011-10-10
user_b      item_b            30              2011-10-05         2011-10-10 

ПУНКТЫ

item_id |  item_name  |  item_price
------------------------------------
item_a      Item AA         500
item_b      Item BB         1000

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

Однако, кроме того, что мне нужно, это то, что SELECT должен покрывать (вычислять сумму) только те транзакции элемента , которые имеют статус его пользователя Завершено иэто приложение является последним .

Повторюсь, таблицы application и item_transactions будут содержать несколько записей одним и тем же пользователем с течением времени, что должно быть охвачено (ВЫБРАНО) - это те транзакции в соответствии с последнейтолько приложение (статус Завершено ).


SELECT
    item_po.poid,
    SUM(item_transactions.quantity_ordered) AS qtysum,
    item_transactions.item_id,
    item_transactions.quantity_ordered,

    items.item_id,
    items.item_price,

    applications.user_id,
    applications.status

FROM
    items

WHERE
    applications.status='Ended'

GROUP BY
    item_transactions.user_id

Ответы [ 3 ]

0 голосов
/ 10 октября 2011

вы можете попробовать это.

SELECT

    SUM(Tran.quantity_ordered) AS qtysum,
    Tran.item_id,
    Tran.quantity_ordered,

    I.item_id,
    I.item_price,

    A.user_id,
    A.status

FROM
    items as I,applications as A, item_transactions AS Tran

WHERE
    A.status='Ended'

GROUP BY
    Tran.user_id

    ORDER BY A.unique_id DESC 

LIMIT 0,1

Если вы ищете только одну последнюю запись, вам нужно использовать LIMIT 0,1 , иначе она будет работать без этого ... я думаю, что это будет полезно для вас.

Спасибо.

0 голосов
/ 10 октября 2011

как насчет, если вы попробуете это:

SELECT
    item_po.poid,
    SUM(item_transactions.quantity_ordered) AS qtysum,
    item_transactions.item_id,
    item_transactions.quantity_ordered,

    items.item_id,
    items.item_price,

    applications.user_id,
    applications.status

FROM
    items

WHERE
    applications.status='Ended'
AND applications.date_of_application = (SELECT MAX(date_of_application) FROM applications
WHERE status='Ended' LIMIT 0, 1)

GROUP BY
    item_transactions.user_id

Поскольку вам нужно самое последнее приложение, вы должны получить самую последнюю дату всех завершенных приложений, независимо от того, когда оно закончилось, но я сомневаюсь в этом утверждении, что статус его пользователя "Закончен" и что это приложение является самым последним «. потому что я подумал, что вы могли бы сказать, что после завершения транзакции транзакция станет самой последней, независимо от того, когда она начала присутствовать в записи, если это так, вместо использования атрибута date_of_application вы можете каким-то образом использовать date_ended вместо этого.

Надеюсь, это поможет.

:)

0 голосов
/ 10 октября 2011

Чтобы выбрать только последнее приложение для каждого пользователя, вы можете использовать подзапрос, чтобы выбрать идентификаторы этих приложений и объединить таблицу приложений с этим подзапросом.Предполагая, что идентификаторы приложений упорядочены в хронологическом порядке:

SELECT
  item_po.poid,
  SUM(item_transactions.quantity_ordered) AS qtysum,
  item_transactions.item_id,
  item_transactions.quantity_ordered,
  items.item_id,
  items.item_price,
  applications.user_id,
  applications.status   
FROM
  applications
  NATURAL JOIN (
    SELECT
      MAX(unique_id) AS unique_id
    FROM applications
    WHERE status = 'Ended'
    GROUP BY user_id
  ) AS foo
  /* ... other joins here ... */

Однако из вашего описания я не смог понять, как именно транзакции должны быть присоединены к приложениям.Я предполагаю вы, вероятно, хотите что-то вроде этого:

  JOIN item_transactions
    ON date_requested BETWEEN date_of_application AND date_ended
  NATURAL JOIN items

, но я не уверен в точных критериях соединения.(Например, что если товар был запрошен в течение периода подачи заявки, но доставлен после его окончания? Или запрошен раньше, но доставлен в течение периода подачи заявки?)

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