2011-11-07 6 views
0

質問から正しい結果を得るには少し問題があります。結合を使用して日付順に一定数のレコードを取得するには

現時点で私は2つのテーブル、main_catsと製品を持っています。

私が後にした結果は、日付順に6つのレコードであり、ユニークなmain_cat_idが1つしかありません。 main_cat_id、main_cat_title

  • 製品::PRODUCT_ID、main_cat_id、PRODUCT_NAME、DATE_ADDED

    基本的なテーブル構造は

    • Main_catsです。

    main_catテーブルをproductsテーブルに結合すると問題が発生します。 ORDER BY句は完全に無視されているようです。

    SELECT date_added, product_name,main_cat_title FROM ic_products p 
    JOIN ic_main_cats icm on icm.main_cat_id=p.main_cat_id 
    WHERE p.main_cat_id IN (1,2,12,22,6,8) 
    GROUP BY p.main_cat_id 
    ORDER BY date_added ASC 
    LIMIT 6 
    

    私がままにすると、クエリの作品を結合するが、複数のmain_cat_idを示し、必要に応じて、私はmain_cat_titleを表示することができません。

  • 答えて

    0

    あなたの質問は(心に)「分/グループごとの最大の日付とそれに関連するフィールドを選択」という質問です。

    SELECT p.date_added, p.product_name, icm.main_cat_title 
    FROM ic_products p 
    LEFT JOIN ic_products p2 
    ON p.main_cat_id=p2.main_cat_id 
    AND p.date_added > p2.date_added 
    LEFT JOIN ic_main_cats icm ON icm.main_cat_id=p.main_cat_id 
    WHERE p2.date_added IS NULL 
    AND p.main_cat_id IN (1,2,12,22,6,8) 
    

    私に説明してみましょう:上記のクエリの最初のLEFT JOINされ、この表を見て:

    SELECT p.date_added, p.product_name 
    FROM ic_products p 
    LEFT JOIN ic_products p2 
    ON p.main_cat_id=p2.main_cat_id 
    AND p.date_added > p2.date_added 
    WHERE p2.date_added IS NULL 
    

    これは、それ自体にproductsに参加する:それはそれぞれの中date_addedペアのすべての組み合わせを持つテーブルを作成しますカテゴリでは、最初の列の日付は常に2番目の列の日付よりも大きくなります。

    これは左結合であるため、最初の列の日付がそのカテゴリで最も小さい場合、2番目の日付はNULLになります。

    だから、これは基本的に各カテゴリの最小の日付(私はあなたの質問にあなたのORDER BY date_added ASCをオフに基づいて、あなたが最小の日付すなわち最も初期の発生をしたいと仮定選択 - あなたは最新date_addedを望んでいた場合は、<>を変更したいが上記の結合で)。

    第2のLEFT JOINからicmは元の質問のちょうど1つで、main_cat_titleを取得できます。

    まず、1行だけ最初LEFT JOINからmain_cat_idおかげごとに取得され、そして第二に、あなたのAND p.main_cat_id IN (1,2,12,22,6,8)はわずか6つのカテゴリを選択しているため、ここでLIMIT 6する必要はありません。したがって、カテゴリごとに1つの行に6つのカテゴリが6つの行を取得します。 (または最大6;コースの特定のカテゴリにアイテムがない場合は、行は取得されません)。

    +0

    わずか2ヶ月後に... この質問に数多く感謝します。 – Jamie

    0

    これは動作するはずです...

    SELECT p.main_cat_id as cat_id, product_name,main_cat_title, MAX(date_added) FROM ic_products p 
    JOIN ic_main_cats icm on icm.main_cat_id=p.main_cat_id 
    WHERE p.main_cat_id IN (1,2,12,22,6,8) 
    GROUP BY p.main_cat_id 
    ORDER BY date_added ASC 
    LIMIT 6 
    
    +0

    DMN、入力いただきありがとうございます。 – Jamie

    +0

    私はmain_cat_idでdistinctキーワードを試しましたが、main_cat_id = 1で3つ、main_cat_id = 3で3つの結果が得られました。 DISTINCTキーワードを考えれば奇妙です。 – Jamie

    +0

    このお試しください:SELECT DISTINCT main_cat_id、PRODUCT_NAME、main_cat_titleをic_products Pから がicm.main_cat_id = p.main_cat_id にic_main_cats ICMを登録しようWHERE DATE_ADDED ASC BY(1,2,12,22,6,8) ためにp.main_cat_id LIMIT 6 – dmn

    関連する問題