2016-09-23 29 views
0

私は店の製品を持つテーブルを持っています。これらの製品にはvalid_fromとvalid_toの日付があります。私の質問では、各店舗の最初のx個のレコードだけが現在有効で、最後のinsert descで注文されたいと思っています。Mysql:グループの最初のxレコードを取得

SELECT * FROM 
    (
     SELECT 
      s.id as shopid, ss.name as shopname, p.name as productname, p.validfrom, p.validto 
     FROM 
      product p 
     JOIN 
      shop s ON p.shopid = s.id 
     WHERE 
      s.status = 'Active' AND 
      (now() BETWEEN p.validfrom and p.validto) 
     ORDER BY p.insert DESC 
    ) as a 

GROUP BY 
    shopid 
ORDER BY 
    shopname asc 

これは明らかに私だけ各店舗の最新の記録を与えるが、私は、最新の2つのまたは3レコードを持つようにしたい:

私は現在、次のクエリを使用しています。どうすればこれを達成できますか?

ボーナスに関する質問:1店舗ごとに違います。だからショップAにとっては最初のレコードだけを、ショップBについては最初の2つのレコードを持っていたいと思います。 s.num_of_recordsのように、この番号を保持している各店舗のデータベースフィールドがあると仮定してもよいでしょう。

同様の問題(が重複する可能性は)正しい方向に私を得たが、それは完全に私の問題を解決していない(最新のコメントを参照してください)

+0

[GROUP BY内のLIMITを使用してグループごとにN個の結果を得るには?](http://stackoverflow.com/questions/2129693/using-limit-within-group-by-to-get-n-results) -per-group) – e4c5

+0

まったく同じではありませんが、正しい方向に私を得た同様の質問、ありがとう。私は今使用しています: 'code' @currcountを:= IF(@currvalue = s.id、@currcount + 1、1)ランクAS @currvalue:= s.id AS lastshopid は' を作るためにcode'同じ店舗にランクされていますが、これはいつも何らかの形では機能しません。いくつかのショップは適切なランク付けをしているものもあれば、1つがランキングであるものもあります。何が間違っている可能性がありますか?私はshopidによって注文しています。 – MNL

+0

あなたのMySQLのバージョンは何ですか? –

答えて

0

これは、各レコードに、前のshopidに基づいてランクを与えることによって動作します。 shopidが同じなら、私は+1します。それ以外の場合は1にランク付けします。

ただし、問題はあります。私はshopidによって注文を使用していますが、それはすべてのお店のために正しくランクされていません。私はチェックするためにlastshopidをクエリに追加しました。レコードは結果でショップによって注文されましたが、lastshopidは別のIDを持つことがあります。私は順序が最初のものではなく最後に行われるので、それがなければならないと思います。

誰でもこれを解決する方法がありますか?このランク付けのソリューションを稼働させるには、適切な順序でお店が必要です。

0

productテーブルでLEFT JOINを追加すると、後で挿入された同じ店舗の製品数をカウントできます。その数値は、num_of_records列と比較できます。役立つかもしれない

SELECT s.id as shopid, s.name as shopname, 
     p.name as productname, p.validfrom, p.validto 

FROM shop s 

JOIN product p 
    ON p.shopid = s.id 

LEFT JOIN product p1 
    ON p1.shop_id = p.shop_id 
    AND p1.validfrom <= NOW() 
    AND p1.validto >= NOW() 
    AND p1.`insert` > p.`insert` 

WHERE s.status = 'Active' 
    AND p.validfrom <= NOW() 
    AND p.validto >= NOW() 

GROUP BY p.id 

HAVING COUNT(p1.id) + 1 <= s.num_of_records 

ORDER BY shopname asc 

インデックス:shop(status, name)product(shop_id, validfrom)またはproduct(shop_id, validto)(おそらく秒1)。

注1:同じ店舗で同時に2つの商品(同じ秒)を挿入し、その両方がその店舗の限定リストの最後になる候補の場合は、両方が選択されます。 insert列のAUTO_INCREMENT列instedを使用すると、これは起こりません。

注2:グループサイズ(1ショップあたりの製品数)によっては、このクエリが遅くなることがあります。

+0

これはすごくうれしくて、ありがとう!私はしばらくの間結果をキャッシュしているので、パフォーマンスは大きな問題ではありません。 – MNL

関連する問題