2016-07-01 8 views
0

最初のテーブルに私は命令をしています。 2番目の - これらの注文に送るメッセージ。最後のメッセージから日付とステータスを取得する必要があります(メッセージがまだ送信されなかった場合はNULL)。複合キーで接続されたテーブル - "order_id + offer"。各グループの最後のアイテムを取得するMySql

"受注" テーブル:

+----------+----------+--------+----------+ 
| order_id | offer | active | timezone | 
+----------+----------+--------+----------+ 
|  6 | kopiya |  1 |  0 | 
|  6 | kopiya-3 |  1 |  0 | 
|  10 | kopiya |  1 |  180 | 
|  23 | kopiya-2 |  1 |  0 | 
|  27 | kopiya-2 |  0 |  0 | 
+----------+----------+--------+----------+ 

"SMS" テーブル:

+------+----------+----------+------+--------+---------------------+ 
| key_ | order_id | offer | type | status | date    | 
+------+----------+----------+------+--------+---------------------+ 
| 1 |  6 | kopiya | text |  1 | 2016-06-20 00:00:00 | 
| 2 |  6 | kopiya-3 | text |  0 | 2016-06-21 00:00:00 | 
| 3 |  10 | kopiya | text |  0 | 2016-06-27 00:00:00 | 
| 4 |  27 | kopiya-2 | text |  1 | 2016-06-21 00:00:00 | 
| 6 |  6 | kopiya-3 | text |  1 | 2016-06-23 00:00:00 | 
+------+----------+----------+------+--------+---------------------+ 

結果は以下のようになります。

+----------+----------+---------------------+--------+ 
| order_id | offer | last_date   | status | 
+----------+----------+---------------------+--------+ 
|  6 | kopiya | 2016-06-20 00:00:00 |  1 | 
|  6 | kopiya-3 | 2016-06-23 00:00:00 |  1 | 
|  10 | kopiya | 2016-06-27 00:00:00 |  0 | 
|  23 | kopiya-2 | NULL    | NULL | 
+----------+----------+---------------------+--------+ 

このクエリは正しくない動作します。

SELECT o.order_id, o.offer, max(date) as last_date, status 
FROM orders AS o 
LEFT JOIN sms AS s 
ON o.order_id=s.order_id AND o.offer=s.offer 
WHERE `active` = 1 
GROUP BY o.order_id, o.offer; 

それはショー:キー「6 kopiya-3」については

+----------+----------+---------------------+--------+ 
| order_id | offer | last_date   | status | 
+----------+----------+---------------------+--------+ 
|  6 | kopiya | 2016-06-20 00:00:00 |  1 | 
|  6 | kopiya-3 | 2016-06-23 00:00:00 |  0 | 
|  10 | kopiya | 2016-06-27 00:00:00 |  0 | 
|  23 | kopiya-2 | NULL    | NULL | 
+----------+----------+---------------------+--------+ 

それは= 0の状態を返しますが、それは最初の行から、この値ではなく、最大の日付を持つ行を取得するので、1を期待。これをどうすれば解決できますか?

私の構文が正しい

サイドノートであればうまくいくかもしれない

答えて

0
SELECT o.order_id, o.offer, max(date) as last_date, (select (SELECT sd.status FROM sms sd WHERE sd.order_id=o.order_id AND sd.offer=s.offer ORDER BY sd.key_ DESC LIMIT 1) as 'st' case when st = '1' then '1' else '0' end) as status 
FROM orders AS o 
LEFT JOIN sms AS s 
ON o.order_id=s.order_id AND o.offer=s.offer 
WHERE `active` = 1 
GROUP BY o.order_id, o.offer; 

:私の答えは

1

が、これは単に異なってフォーマット、Unixのひとつの答えとしてちょうど同じです笑ひどいですか? もしそうなら、彼らは私にそれを打ち負かしましたが、これは(order_id,offer)のPKを前提とし、要求されたものとは少し異なる結果セットを返します。

SELECT o.order_id 
    , o.offer 
    , s.date last_date 
    , s.status 
    FROM orders o 
    LEFT 
    JOIN 
    (SELECT x.* 
     FROM sms x 
     JOIN 
      (SELECT order_id 
        , offer 
        , MAX(date) date 
       FROM sms 
       GROUP 
        BY order_id 
        , offer 
      ) y 
      ON y.order_id = x.order_id 
      AND y.offer = x.offer 
      AND y.date = x.date 
    ) s 
    ON s.order_id = o.order_id 
    AND s.offer = o.offer 
    WHERE o.active = 1; 
+0

いいえ、あなたは数分で私にそれを打つように見えます。しかし、このクエリに関する注意: 'order_id'、' offer'と 'date'に' y'を結合すると、1行は保証されません - 理論的には、すべてが同じ値を持つ> 1行になる可能性がありますこれらのフィールドは、重複してしまうことになります。 'MAX(date)'を使いたい場合は、 'MAX(key_)'を得るために別のサブ選択が必要になるかもしれません。 –

+0

はい。私は '(order_id、offer)'にPKを仮定しています。 – Strawberry

+0

申し訳ありませんが、私は本当にそれを理解していません。 – Strawberry

0
SELECT 
    o.order_id, 
    o.offer, 
    s3.`date` AS last_date, 
    s3.status 
FROM 
    orders o 
    LEFT JOIN 
    (SELECT 
     s1.order_id, 
     s1.offer 
    FROM 
     sms s1 
     JOIN 
     (SELECT 
      MAX(key_) AS key_ 
      FROM 
      sms 
      GROUP BY 
      order_id, 
      offer) s2 ON s1.key_ = s2.key_) s3 ON (o.order_id = s3.order_id AND o.offer = s3.offer) 
0

ビンゴ、あなたがGROUP BYを置く場所の問題がある:

SELECT o.order_id, o.offer, max(date) as last_date, status 
FROM orders AS o 
LEFT JOIN sms AS s 
ON o.order_id=s.order_id AND o.offer=s.offer 
WHERE `active` = 1 
GROUP BY o.order_id, o.offer; 

これは、次のような結果になります。

WITH C AS (SELECT --columns 
FROM Orders AS A 
WHERE O.Active = 1 
GROUP BY O.Order_ID, O.Offer) 

SELECT --columns 
FROM C 
INNER JOIN sms AS S ON O.Order_ID = S.order_ID 
        AND O.Offer = S.Offer; 

によってグループが確定的ではないので、あなたはあなたが持っていたエラーを取得します。 代わりに、このような何か試してみてください:

SELECT B.ORDER_ID, A.OFFER, B.Status, B.DATE 
FROM Orders A 
INNER JOIN (SELECT Order_ID, Offer, MAX([DATE]) AS [DATE], MAX(Status) AS [Status] 
      FROM #EXAMPLE2 
      GROUP BY Order_ID, OFFER) B ON A.Offer = B.OFFER 
            AND A.Order_ID = B.Order_ID 
WHERE ACTIVE = 1; 

Results: 
-- 6 kopiya  1  2016-06-20 00:00:00.000 
-- 27 kopiya-2 1  2016-06-21 00:00:00.000 
-- 6 kopiya-3 1  2016-06-23 00:00:00.000 
-- 23 kopiya-2 NULL NULL 

今すぐあなたのOrdersテーブル上の述語がそれを行うことになっているもの行い、結果をフィルタリングします。

+0

おっと、それを間違って読んでください(半分の結果しか働いていませんでした.xD) –

0

私はこれが何をしたいんだと思う:このクエリの

select sms.* 
from orders o left join 
    sms 
    on o.order_id = sms.order_id and o.offer = sms.offer 
where sms.date = (select max(sms2.date) 
        from sms sms2 
        where sms2.order_id = sms.order_id and sms2.offer = sms.offer 
       ) or 
     sms.order_id is null 

、私はsms(order_id, offer, date)にインデックスを助言します。

関連する問題