私はこれを何時間も理解しようとしてきましたが、行き詰まっているようです。
以下のクエリで実行したいのは、いくつかのロケーション 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 秒かかります。