2

私のテーブルには次の関係があります

item.rb

has_one :item_shipping_detail

item_shipping_detail.rb

belongs_to  :item
has_many :shipping_statuses

status.rb

belongs_to  :item_shipping_detail

元。データ

アイテム

id   title     city      state             country
 1   Title1    Nagpur    Maharashtra       India

item_shipping_details

id   item_id    price     description
 1   1          10        Electronic

ステータス

id   item_shipping_detail_id    status_city     status_state   status_country  created_at 
 1   1                           Mumbai         Maharashtra    India           2012-01-09 07:58:16
 2   1                           Akola          Maharashtra    India           2012-01-10 07:58:16
 3   1                           Nagpur         Maharashtra    India           2012-01-11 07:58:16

(LATEST or MAX)単一のクエリを使用して、次の結果 (item、item_shipping_details、statuses ) が必要です

id title city     state         country  price  description  status_city  status_state    status_country
 1 Title1 Nagpur  Maharashtra    India    10    Electronic   Nagpur       Maharashtra    India

JYI:- Rails 2.3.8 を使用しています

4

5 に答える 5

4

試す:

select i.id,
       i.title,
       i.city,
       i.state,
       i.country,
       d.price,
       d.description,
       s.status_city,
       s.status_state,
       s.status_country
from items i
left join item_shipping_details d on i.id = d.item_id
left join 
   (select s1.* from statuses s1
     where not exists 
           (select * from statuses s2
        where 
                s2.item_shipping_detail_id = s1.item_shipping_detail_id 
                and s2.created_at> s1.created_at) )  s
on d.id = s.item_shipping_detail_id

subselect の where 句は、新しいレコードがあるすべてのレコードを除外します。これは事実上、Mark Ba​​nnister のクエリ (私の Postgresql 9.1 データベースでは問題なく動作します) と同じですが、パーティション関数を使用していません。

おそらくパーティション関数ほど効率的ではないので、なぜあなたの関数が実行されていないのか (おそらく 8.4 の互換性設定か何か?) を解決できれば、私は彼のクエリを使用します.

于 2012-01-20T18:58:35.747 に答える
2

postgresql 拡張機能である DISTINCT ON を使用します。

select distinct on(i.id, d.id)
   i.id,
   i.title,
   i.city,
   i.state,
   i.country,
   d.price,
   d.description,
   s.status_city,
   s.status_state,
   s.status_country
from items i
left join item_shipping_details d on i.id = d.item_id
left join statuses s on s.item_shipping_detail_id = d.id
order by i.id, d.id, s.created_at desc

標準構文も考慮してください。

select * from (
select i.id,
   i.title,
   i.city,
   i.state,
   i.country,
   d.price,
   d.description,
   s.status_city,
   s.status_state,
   s.status_country,
   row_number() over(partition by d.id, i.id order by s.created_at desc) as rn
from items i
left join item_shipping_details d on i.id = d.item_id
left join statuses s on s.item_shipping_detail_id = d.id
) tab where tab.rn = 1
于 2012-01-23T10:39:38.590 に答える
0

(削除された回答へのコメントから)使用していることが判明したため、を8.3.8使用することはできませんrow_number()。これは、どのレコードが最新であるかを判断するために、集約サブクエリに参加する傾向があることを意味します。何かのようなもの...

SELECT
   i.id,
   i.title,
   i.city,
   i.state,
   i.country,
   d.price,
   d.description,
   s.status_city,
   s.status_state,
   s.status_country
FROM
  items                    i
LEFT JOIN
  item_shipping_details    d
    ON i.id = d.item_id
LEFT JOIN
  (SELECT item_shipping_detail_id, MAX(created_at) AS created_at FROM statuses GROUP BY item_shipping_detail_id)   lookup
    ON lookup.item_shipping_detail_id = d.id
LEFT JOIN
  statuses                 s
    ON  s.item_shipping_detail_id = lookup.item_shipping_detail_id
    AND s.created_at              = lookup.created_at

注: サブクエリと結合を最適化するには、statusesテーブルに適切なインデックスを付ける必要があります。(item_shipping_detail_id, created_at)

代わりにインデックスをオンにしていて、常に高いとは、レコードが低いレコードよりも新しいことを意味する(item_shipping_detail_id, id)ことを保証できる場合は、クエリでの出現をに置き換えることができます。id idcreated_atid

于 2012-01-23T12:16:53.247 に答える
0

これを試して

select distinct on(i.id, d.id)
   i.id,
   i.title,
   i.city,
   i.state,
   i.country,
   d.price,
   d.description,
   s.status_city,
   s.status_state,
   s.status_country
from items i
left join item_shipping_details d on i.id = d.item_id
left join statuses s on s.item_shipping_detail_id = d.id
where s.id = (select Max(id) as id from statuses where item_shipping_detail_id = d.id)
order by i.id, d.id desc
于 2012-01-23T16:19:47.587 に答える
0

到着日など、最新のステータスを選択できるように、ステータスに「何か」を含める必要があります。その追加の列を提供する前に、質問に答える方法はありません。

于 2012-01-11T08:45:06.460 に答える