2012-03-25 11 views
1

私は2つのテーブルを持っています...最初は(page_id、page_title)行のページリストです。 2番目のページは、それぞれ価格(item_id、page_id、item_title、item_price)を持つページのアイテムのリストです。MYSQL各 "ページID"の3つの結果を選択

累積的に最も高い価格が最初に注文されたページで、各ページ(最初に最も高いitem_priceで注文)から上位3項目を取得したいと考えています。これは私のMYSQLの能力をはるかに超えており、これを最も効率的にする方法のアドバイスを探しています! :)ありがとう!

+0

一度にすべてのページの上位3項目、または一度に1ページを取得しますか? –

+0

すべてのページのリストを出力して、各ページの上位3つの項目を表示したい(最高の価格はトップ、累計の最高価格で注文されたページ)。ありがとう! – PotatoFro

+0

アイテムがあれば、どのページに属しているかをどのように知っていますか? –

答えて

0

これにはいくつかの方法があります。私がやることは、「自分のアイテムの合計で注文されたすべてのページを取得してから、PHPでループさせ、それぞれのページでトップページ3アイテムを取得する」というクエリを実行することです。

意味がありますか?

クエリ1(未テスト、私の携帯電話に書かれた):

SELECT p.page_name, (SELECT SUM(item_price) FROM items WHERE page_id = p.page_id) AS cumulative_price FROM pages p ORDER BY cumulative_price DESC; 

クエリ、クエリ1の結果をループ(もテストされていない)2:

SELECT * FROM items WHERE page_id = '$currentPageId' ORDER BY item_price DESC LIMIT 3; 
+0

明らかに、2番目のクエリで使用するために最初のクエリにページIDを含めることになります。 –

0
  • は、私はすべてのpage_idのを想定していますitem_idと等しいです、そして、それは彼らが一緒につながっている方法です。 (ない場合は、私を修正してください。)私はちょうど私が英語では「SOME_ITEM_ID」

    SELECT * FROM `table2` WHERE `item_id` = 'SOME_ITEM_ID' ORDER BY `item_price` DESC; 
    

を探している第二表「表2」とのitem_idを呼ぶつもりです

  • 何これは言っている:

    は、ITEM_IDはこのあるtable2のからすべてを選択し、

    降順でITEM_PRICEして、リストを注文します

    このSQL文はすべてのヒットを返しますが、コード内の最初の3文字だけを出力します。

  • +0

    私の悪いところ - 元の投稿を編集しました。 itemsテーブルは、 "page_id"を介してpagesテーブルにリンクされています。項目には「item_id」と「page_id」の両方があります。 – PotatoFro

    0

    私の腸がで結果を各paqeためselect item_price from item where page_id = ? order by item_price desc limit 3少しやって、そしておそらく付着し、すべてのページを介してアプリケーションにforループを行うことよりも、これを行うには速く方法は、おそらく存在しないことを私に伝えますmemcachedのようなものなので、あなたのデータベースにはあまり課税していません。

    しかし、私は挑戦が好きなので、私はそれをどうにかしようとします。奇数サブ選択は、おそらくitems内のすべての単一の行のために仕事の非常に多くをするつもりであることを

    SELECT p1.*, i1.*, 
     (SELECT count(*) 
        FROM items i2 
        WHERE i1.item_price < i2.item_price 
        AND p1.page_id = i2.page_id) price_rank, 
    FROM pages p1 
    LEFT OUTER JOIN items i1 
    ON p1.page_id = i1.page_id 
    WHERE price_rank < 3; 
    

    。他の多くのRDBMsesには、上記をもっと上品に行うことができるウィンドウ関数と呼ばれる機能があります。あなたは、PostgreSQLを使用している場合たとえば、あなたが書かれている可能性があり:

    SELECT p1.*, i1.*, 
        RANK(i1.item_price) 
        OVER (PARTITION BY p1.page_id 
          ORDER BY i1.item_price DESC) price_rank 
    FROM pages p1 
    LEFT OUTER JOIN items i1 
    ON p1.page_id = i1.page_id 
    WHERE price_rank <= 3; 
    

    そしてプランナーは、ランクの結果が適切に発生した順序で行を訪問するように配置されているだろう。

    関連する問題