0

私はこれを何時間も理解しようとしてきましたが、行き詰まっているようです。

以下のクエリで実行したいのは、いくつかのロケーション ID をINオペレーターに渡し、MySQL にすべての結果 (テーブルが大きすぎる) を返すのではなく、すべてのロケーション ID の 5 アイテムのみ (アイテムが存在する場合) を返すことです。 .

LIMIT 100私はあなたの助けを借りてそれを完成させるまで一時的に置きます。

クエリは次のとおりです。

$sql = "SELECT SQL_CACHE deals.deal_ID, deals.slug, deals.url, deals.previous_price, deals.title, deals.image, deals.price, deals.end, deals.purchases, deals.date_added,
        deals_locations.location_ID, deals.hits
        FROM deals
        INNER JOIN deals_locations
        WHERE deals.status = 'active'
        AND deals_locations.deal_ID = deals.deal_ID
        AND deals_locations.location_ID IN (".implode(', ', $location_IDs).")
        GROUP BY deals.deal_ID
        LIMIT 100;";

どうぞよろしくお願いいたします。

編集:これで、クエリの出力は次のようになります。

SELECT SQL_CACHE deals.deal_ID
    ,deals.slug
    ,deals.url
    ,deals.previous_price
    ,deals.title
    ,deals.image
    ,deals.price
    ,deals.end
    ,deals.purchases
    ,deals.date_added
    ,deals_locations.location_ID
    ,deals.hits
FROM deals
INNER JOIN deals_locations
WHERE deals.status = 'active'
AND (
    SELECT COUNT(*) FROM deals
    WHERE deals.deal_ID = deals_locations.deal_ID
) <= 5
AND deals_locations.deal_ID = deals.deal_ID
AND deals_locations.location_ID IN (1, 2, 3, 5, 7, 12, 13, 26, 27, 28, 29, 30, 31, 34, 35, 36, 38, 39, 40, 41, 42, 43, 44, 46, 49, 52, 53, 54, 55, 56, 60, 62, 64, 65, 66, 67, 68, 69, 70, 72, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 89, 90, 97, 107, 10, 21, 32, 33, 37, 51, 4, 6, 8, 9, 11, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 45, 47, 48, 50, 57, 58, 59, 61, 63, 71, 73, 84, 85, 86, 87, 88, 91, 92, 93, 94, 95, 96, 98, 99, 100, 101, 102, 103, 104, 105, 106, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160)
GROUP BY deals.deal_ID;

ただし、同じ場所のレコードが 5 つ以上表示されます。

EDIT 2:私はこのUNION ALLアプローチを試してみましたが、うまくいっているようです。これで合計 30 行の結果が得られましたが、クエリのサイズが気になります。

私のクエリは次のようになります: http://pastebin.com/r6vyG594

サイズexplainが大きいのでネットに載せられません。クエリを効率的にしてサイズを小さくするにはどうすればよいですか?

実行には約 0.2158 秒かかります。

4

2 に答える 2

0

これを行うには、次の 2 つの方法があります。

1 PHP内破の代わりにサブクエリ:

...
AND deals_locations.location_ID IN (SELECT id FROM deals_locations WHERE .... LIMIT 5)
GROUP BY deals.deal_ID
...

編集: MySQL はサブクエリの制限をサポートしていません

2 多次元配列で 5 つの要素を作成/使用する場合は、配列を制限します

implode(', ', $locations_IDs[0])等々。

1 つのクエリ/ID を作成することもできます

于 2012-09-22T18:08:52.570 に答える
-1

まず、内部結合を使用してONステートメントを追加します。

$sql = "SELECT SQL_CACHE deals.deal_ID, deals.slug, deals.url, deals.previous_price, deals.title, deals.image, deals.price, deals.end, deals.purchases, deals.date_added,
    deals_locations.location_ID, deals.hits
    FROM deals
    INNER JOIN deals_locations ON deals_locations.deal_ID = deals.deal_ID AND deals_locations.location_ID IN (".implode(', ', $location_IDs).")

    WHERE deals.status = 'active'
    GROUP BY deals.deal_ID
    LIMIT 100;";

上記の例では、deals_locationsに関連する両方のwhereステートメントをjoinステートメントに移動しました。これにより、そのテーブルから結合されるレコードの数が制限されます...

于 2012-09-22T18:18:26.487 に答える