最初のテーブルに私は命令をしています。 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を期待。これをどうすれば解決できますか?
私の構文が正しいサイドノートであればうまくいくかもしれない
いいえ、あなたは数分で私にそれを打つように見えます。しかし、このクエリに関する注意: 'order_id'、' offer'と 'date'に' y'を結合すると、1行は保証されません - 理論的には、すべてが同じ値を持つ> 1行になる可能性がありますこれらのフィールドは、重複してしまうことになります。 'MAX(date)'を使いたい場合は、 'MAX(key_)'を得るために別のサブ選択が必要になるかもしれません。 –
はい。私は '(order_id、offer)'にPKを仮定しています。 – Strawberry
申し訳ありませんが、私は本当にそれを理解していません。 – Strawberry