JOIN
製品データベースから内部クエリを実行し、アイテムを名前でグループ化し、名前列を使用して結合を実行する必要がある状況があります。
SELECT p.*, p3.variants, sl.id, l.name as locationName FROM products p
LEFT JOIN (SELECT item, count(DISTINCT id) as variants FROM products GROUP BY item) p3
ON p3.item = p.item
LEFT JOIN stockLevels sl ON sl.id=p.id
LEFT JOIN locations l ON l.id=sl.stockLocation AND l.showStock='1'
WHERE p.id='10459' GROUP BY p.id
クエリ自体の順序をいじって、JOIN
この内部テーブルを最初に作成し、最初に必要な結合を実行すると、クエリの速度に違いが生じると判断しましたが、内部結合(SELECT item, count(DISTINCT id) as variants FROM products GROUP BY item)
は(現在) 7034 を与えていますこれは、約 5 行しか必要ないため不要です。
内部結合を次のように変更すると:
(SELECT item, count(DISTINCT id) as variants
FROM products *WHERE item LIKE '%SOME VALUE%'* GROUP BY item)
これにより、その内部結合によって返される行数が明らかに減少し、約 2 倍の速度になります。
where
しかし、内部節に使用する既知の値がないため、これを行うことはできません。
外部テーブルの結果を内部テーブルに取り込み、外部テーブルを参照する内部クエリを生成する方法はありますか?
SELECT p.*, p3.variants, sl.id, l.name as locationName FROM products p
LEFT JOIN (SELECT item, count(DISTINCT id) as variants
FROM products *WHERE item LIKE p.item * GROUP BY item) p3 << New Where Clause
ON p3.item = p.item
LEFT JOIN stockLevels sl ON sl.id=p.id
LEFT JOIN locations l ON l.id=sl.stockLocation AND l.showStock='1'
WHERE p.id='10459' GROUP BY p.id
上で書いたことがうまくいかないことはわかっていますし、その理由も理解していますが、これらの行で何かを達成できる方法はありますか?
現時点で私のデータベース内のレコードの数では、これは実際には問題ではありません。データは非常に迅速に返されますが、やがてデータが大きくなると、そうなる可能性があると想像できます。
parentId
フルテキストでグループ化する代わりに、整数列を作成することを検討しましたitem
が、アプリケーション内には他にも多くの問題があり、上記と同じ理由で、とにかくクエリを高速化するようには見えませんでした。内部はまだすべての行を返す必要がありました
また、これはMySQLです。
それがまったく役立つ場合は、ここからの出力ですEXPLAIN