0

私は自分自身のために新しい Web サイトに取り組んでおり、DB に 2 つの異なる場所を照会し、それらを比較して、売りと買いの両方のオファーがある場所を表示することを考えています。これにより、場所 A から X を購入し、場所 B で利益を得て販売できることがわかります。

ここに私が持っているテーブルがあります

Table: marketdata
+-----------------------------------------------------+
| orderId | locationId | itemId | Price |   sellorder |    
------------------------------------------------------+
|  34444  |  23444     |  23    | 33    |      Sell     |
|  31434  |  34423     |  234   | 10.5  |     Sell     |
|  34415  |  34453     |  234   | 12.5  |      Buy   |
|  36436  |  33451     |  234   | 13.5  |      Sell    |
+-----------------------------------------------------+

table: locationinfo

+------------------+
|  locId | locName |
+--------+---------+
|  23444 |  west   |
|  34423 |  east   |
|  34453 |  north  |
|  33451 |  south  |
+------------------+

私がする必要があるのは、2 つの特定の場所 (IE 34423 および 34453) に関連している場合、marketdata テーブルからデータを取得することです。これを 2 つの別々のクエリで行います。次に、データを比較して、プルしたアイテムのいずれかが同じかどうかを確認する必要があります (つまり、注文 31434 と 34415 は同じ ItemId です)。それらが同じである場合、買い注文が売り注文よりも高いかどうかを確認する必要があります。そうであれば、その情報を表示します。また、 locationinfoテーブル全体を取得するクエリもあり、 marketdata が表示されると、foreach ループを実行して marketdata の場所 ID に一致する場所名を見つけ、それらがどこにあるかを確認します。

私のPHPの一般的な外観は次のとおりです。

foreach (selldata as sell)
{
    foreach(buydata as buy)
    {
        if(buydata['itemId'] == selldata['itemId'])
        { 
            if(buydata['price'] > selldata['price']
            {
                foreach(locations as loc)
                {
                    if(loc['locId'] == sell['locationId'])
                {
                    display sell location info
                        break;
                }   
                }
                display rest of sell info

                foreach(locations as loc]
                {
                    if(loc['locId'] == buy['locationId'])   
                    {
                        display buy location info
                        break;
                }
                display rest of buy info 
                }           
            }
        }  
    }
}

これは、私が試したいくつかの検索ではかなりうまく機能しましたが、最後に行った検索では 29,000 件以上の結果があり、すべての処理と画面への表示がかなり遅くなりました。数回、タイムアウトして何も表示されませんでした。

2 つのmarketdata検索とlocationinfo検索でデータベースにクエリを実行していることはわかっていますが、すべてを表示しようとするとうまくいきません。大量のコードを取り出し、foreach ループを 1 つだけ残して、データを 1 つだけ表示させましたが、実際の問題は発生しませんでした。約29kの結果がありました。

ページ表示中にデータを比較する効率的な方法はありますか? 現在処理中のデータに複数のページを表示する方法はありますか? たとえば、ページに 50 個のアイテムを配置したいのですが、クエリに LIMIT を設定する以外にそれを行う方法がわかりませんが、最初にすべてのアイテムを比較してどれが最も多いかを確認することはできません。上に表示するための利益。

これを明確に説明したことを願っています。誰でも提供できる助けをありがとう!

4

1 に答える 1

0

これが私の推測です。データベースから本当に必要なものだけを選択します。

marketdata2 つの特定の場所に関連する場合 (IE 34423 および 34453)

IDlocation nameに一致するANDmarketdata location

price is higherそして、特定のアイテムの販売価格よりも購入した場合にのみ場所を表示します。次のクエリは情報を提供します

There are 1 rows resulting from:

QUERY: 
SELECT MAX(price), itemId, locationId, locName FROM marketdata 
LEFT OUTER JOIN  locationinfo ON marketdata.locationId = locationinfo.locId 
WHERE (marketdata.locationId = 34423 OR  marketdata.locationId = 34453) 
    AND sellorder = 'Buy' 
GROUP BY itemId



MAX(price)  itemId  locationId      locName
14.5        234     34423           east
于 2013-04-27T15:28:21.480 に答える