0

私は2つのテーブルを持っています:

sms_send次の列があります。 created_at, order_id, sms_id, mobile, msg

sms_msgには次の列がありますid, short_desc

sms_idに対応しidますsms_msg

sms_sendは同じ を持つ複数の行を持つことができますが、各レコードで同じではない場合がありますorder_idsms_id

sms_msg一意の のみを持ちidます。

2 つのテーブルを結合したい (次の情報を使用して、2013 年 7 月 1 日以降に作成された行のみ:

ごとorder_idに、 を取得して他のテーブルからsms_id結合しshort_descますが、最新のレコードのみを返します。

order_idしたがって、それぞれに対応する結合された最新のレコードがありますshort_desc

これが私の試みです:

SELECT
    *,
    `sms_msg`.`short_desc`
FROM 
    `sms_send`
INNER JOIN
    `sms_msg`
ON
    `sms_send`.`sms_id` = `sms_msg`.`id`
WHERE
    `created_at` > '2013-07-01 00:00:00'
HAVING 
    `created_at` = (SELECT `created_at` FROM `sms_msg` GROUP BY `id` HAVING `created_at` = MAX(`created_at`))

これは機能せず、サブクエリは複数の行を返します。

なんでそうなの?どうすれば修正できますか?

4

1 に答える 1

1

指定されたorder_idcreated_atに対して一意であり、タイプが DATETIME または TIMESTAMP、または正規形式の文字形式である場合、指定された結果セットが返されます。

SELECT s.created_at
     , s.order_id
     , s.sms_id
     , s.mobile
     , s.msg
     , t.short_desc
  FROM (
         SELECT m.order_id
              , MAX(m.created_at) AS latest_created_at
           FROM sms_send m
          WHERE m.created_at >= '2013=07-01' 
          GROUP
             BY m.order_id
       ) l
  JOIN sms_send s
    ON s.order_id = l.order_id
   AND s.created_at = l.latest_created_at
  JOIN sms_msg t
    ON t.id = s.sms_id
于 2013-08-09T06:14:07.597 に答える