0

私はmySQLの問題に直面しています:これらの列を含むmySQLテーブルを取得しました。これはすべての注文と注文のすべての状態を格納します:

    id_order_history / id_employee / id_order / id_order_state / date_add 

特定の*id_order_state*にある*id_order*のリストを取得したいのですが(たとえば10)、この特定の状態の後に状態が変化する注文を取得したくないので、生後7日未満の注文..。

これが私がこれを行うためにどのように考えたかです:

最初に、注文と日付のリストを取得するためのクエリ:

SELECT id_order, date
           FROM '._DB_PREFIX_.'ps_order_history, 
           WHERE TO_DAYS(NOW()) - TO_DAYS(date_add) <= 7 
           AND id_order_state = 10

次に、最新の状態のない注文のみを取得するループ:

$query = '   SELECT id_order, date
           FROM '._DB_PREFIX_.'ps_order_history, 
           WHERE ';

foreach ( $listAbove, $item) {
     $query =+ '
                (( date > $item['date'])
                AND ( id_order = $item['id']))
             ';
 }
 $orderlist = Db::getInstance()->ExecuteS($query);

それは本当に最適化されていません、私はたった1つのクエリでそれを行うことができると確信していますが、実際には方法がわかりません。

これをどのようにきれいにするかについての手がかりはありますか?

4

2 に答える 2

2

私がこの権利を理解している場合、たとえば、最新の状態が10に等しい注文のみが必要です。それでは、注文と最新の状態を取得することから始めましょう

SELECT
   id_order,
   MAX(id_order_history) as m
FROM ps_order_history
GROUP BY id_order

これにより、各注文の最新の注文履歴アイテムが得られます(id_order_historyPKであり、最大値が最新の注文エントリを示していると仮定します)。次に、そのサブクエリを検索して、必要な基準を見つけます。

SELECT
   poh.id_order
FROM ps_order_history poh
INNER JOIN
 (SELECT
   id_order,
   MAX(id_order_history) as m
 FROM ps_order_history
 GROUP BY id_order) sub
 ON sub.id_order = poh.id_order
   AND sub.m = poh.id_order_history
WHERE poh.id_order_state = 10
   AND TO_DAYS(NOW()) - TO_DAYS(poh.date_add) <= 7
于 2013-01-11T16:39:05.213 に答える
0

WHERE句でサブクエリを使用できます。次に例を示します。

create table order_history 
(orderid int, orderstate int, orderdate date, 
primary key(orderid, orderstate, orderdate));

insert into order_history values (1,1,makedate(2012,1));
insert into order_history values (1,2,makedate(2012,2));
insert into order_history values (1,3,makedate(2012,3));
insert into order_history values (2,1,makedate(2012,1));
insert into order_history values (2,3,makedate(2012,3));
insert into order_history values (3,1,makedate(2012,1));

このクエリは、最新orderstateが3であるすべてのアイテムを選択するようになりました。

select a.orderid, a.orderdate from order_history a
where a.orderdate = 
  (select max(orderdate) from order_history b where b.orderid = a.orderid)
and a.orderstate=3

orderdateで制限するには、日付選択用の別の句を外側のwhere句に追加するだけです。

于 2013-01-11T16:51:01.317 に答える