0

のテーブルlocationsとのテーブルがありstockLevelsます。私は複雑なクエリに取り組んでおり、長い間在庫があったアイテム、それらがどこにあるか、その他いくつかのことをすべて1回のヒットで教えてくれます。

その一部は私に不正確な結果を与えています。

... LEFT JOIN ...
SELECT id, sum(stockLevel) as totalStockLevel FROM stockLevels 
    WHERE stockLocation IN 
        ((SELECT 
            GROUP_CONCAT(CONVERT(id, CHAR(8))) as idList 
            FROM `locations` WHERE  `isThirdParty`  = '0' 
            AND `pickFrom`='1' 
        GROUP BY pickFrom)) 
    GROUP BY id) 
ourStock ON ourStock.id=products.id
... MORE OF QUERY ....

これはクエリ全体のスニペットであり、内部SELECTは単独で機能しますが、IDのリストをIN句に適用しておらず、最初の句を読み取ったようです。

それで、より明確に説明するために。

内側SELECT

SELECT 
    GROUP_CONCAT(CONVERT(id, CHAR(8))) as idList 
    FROM `locations` WHERE  `isThirdParty`  = '0' 
    AND `pickFrom`='1' 
GROUP BY pickFrom

カンマ区切りのリスト値を、という名前の列として返します。値は次のとおりですidList1,2,10,11

このクエリは機能します。

元のクエリでそのカンマ区切りのリストを手動で使用すると、次のようにも機能します。

... LEFT JOIN ...
SELECT id, sum(stockLevel) as totalStockLevel FROM stockLevels 
    WHERE stockLocation IN 
        (1,2,10,11) 
    GROUP BY id) 
ourStock ON ourStock.id=products.id
... MORE OF QUERY ....

このコードによってエラーは生成されませんが、生成される結果は次のクエリの結果です。

... LEFT JOIN ...
SELECT id, sum(stockLevel) as totalStockLevel FROM stockLevels 
    WHERE stockLocation IN 
        (1) 
    GROUP BY id) 
ourStock ON ourStock.id=products.id
... MORE OF QUERY ....

そのため、外部クエリのIN句に挿入されている内部クエリによって生成されたコンマ区切りのリストを取得していません。

誰かが理由をアドバイスできますか?

4

1 に答える 1

0

IN()値のリストまたはサブクエリが必要ですが、varcharを指定しています。stockLocationとLocationsを結合して、目的の結果を生成しようとする場合があります。

SELECT stockLevels.id, 
       sum(stockLevels.stockLevel) as totalStockLevel 
  FROM stockLevels 
 INNER JOIN locations
    ON stockLevels.stockLocation = locations.id
   AND locations.isThirdParty = '0'
   AND locations.pickFrom = '1'
 GROUP BY stockLevels.id

もちろん、同じ効果を得るためにgroup_concatを削除することもできます。

WHERE stockLocation IN 
    (SELECT id
       FROM `locations` 
      WHERE `isThirdParty` = '0' 
        AND `pickFrom`='1' 
    )
于 2012-07-30T12:34:20.270 に答える