1

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

ここに画像の説明を入力

4

2 に答える 2

2

SELECT句に相関サブクエリを配置できます。

SELECT p.*, sl.id, l.name as locationName,
       (SELECT COUNT(distinct id)
        FROM products p3
        WHERE p3.item = p.item) as variants
FROM products p
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
于 2013-09-14T09:28:39.113 に答える
0

5 つだけ必要な場合は、従来の方法で行います。

SELECT 
    p.*, 
    p3.variants, 
    sl.id, 
    l.name as locationName, 
    (SELECT count(DISTINCT id) 
     FROM products 
     WHERE item LIKE p.item GROUP BY item) total 
FROM products p
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

ここで、親テーブルにアクセスできます。

于 2013-09-14T09:27:20.653 に答える