4

2 つのテーブルがあります。1 つは購入できるアイテムを説明するテーブルで、もう 1 つは他のアイテムを購入するための「必要なアイテム」を格納するテーブルです。最初の表には、取引の形態として他のアイテムを必要とするアイテムがいくつかあります。また、必要なアイテムが一定量必要になる場合もあります。2 つのテーブルのスキーマは次のとおりです。

+---------------+-----------------+------+-----+---------+----------------+
| Field         | Type            | Null | Key | Default | Extra          |
+---------------+-----------------+------+-----+---------+----------------+
| storeID       | int(5) unsigned | NO   | PRI | NULL    | auto_increment |
| itemID        | int(10)         | NO   |     | NULL    |                |
| quantity      | int(10)         | NO   |     | NULL    |                |
| cost          | int(10)         | NO   |     | NULL    |                |
+---------------+-----------------+------+-----+---------+----------------+

+----------+---------+------+-----+---------+-------+
| Field    | Type    | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| parentID | int(10) | NO   |     | NULL    |       |
| itemID   | int(10) | NO   |     | NULL    |       |
| quantity | int(10) | NO   |     | NULL    |       |
+----------+---------+------+-----+---------+-------+

2 番目のテーブルは最初のテーブルとリンクしていますstoreID <-> parentID。ストア内のアイテムには、多くの必要なアイテムが含まれている場合があります。

問題: ストア内のすべてのアイテムを返すクエリを実行する必要がありますが、必要なすべてのアイテムとその数量も表示されます。次のようになります。

4 x Item1,5 x Item2

私はこの現在のクエリを持っています:

SELECT a.*, b.typeName, GROUP_CONCAT(CONCAT(c.quantity, " x ", d.typeName)) as `reqItems`
        FROM lpStore a 
        INNER JOIN typeNames b ON (a.typeID = b.typeID)
        INNER JOIN lpRequiredItems c ON (a.storeID = c.parentID)
        INNER JOIN typeNames ON (d.typeID = c.typeID)
        GROUP BY c.parentID
        ORDER BY a.cost ASC 

typeNamesitemID と実際の名前をリンクする単純なテーブルです。

現在、このクエリはうまく機能していますが、HAVE NO REQUIRED ITEMSの項目が含まれていないようです。GROUP BY とともに JOINS の 1 つであると思われます (そのテーブルに存在しないすべての NULL 値をグループ化する可能性がありますか?) が、まだ把握できていません。何も必要ない場合は、その列に空白または NULL を返す必要があります。

編集:サンプルデータ

簡単にするために、アイテム名テーブルとのテーブルの結合を削除しました

ここで入手できるサンプル データ: http://www.sqlfiddle.com/#!2/d8dca/1

実績:

+---------+--------+------+----------+-----------------------------+
| storeID | typeID | cost | quantity | reqItems                    |
+---------+--------+------+----------+-----------------------------+
|       1 |   2514 | 2000 |        3 | 5 x 3668,10 x 4825          |
|       3 |   8785 | 5000 |        2 | 1 x 4875,15 x 1102,5 x 9813 |
|       4 |    579 | 1500 |        5 | NULL                        |
+---------+--------+------+----------+-----------------------------+

予想された結果:

+---------+--------+------+----------+-----------------------------+
| storeID | typeID | cost | quantity | reqItems                    |
+---------+--------+------+----------+-----------------------------+
|       1 |   2514 | 2000 |        3 | 5 x 3668,10 x 4825          |
|       2 |   3199 | 1000 |        1 | NULL                        |
|       3 |   8785 | 5000 |        2 | 1 x 4875,15 x 1102,5 x 9813 |
|       4 |    579 | 1500 |        5 | NULL                        |
+---------+--------+------+----------+-----------------------------+
4

3 に答える 3

4

問題は です。 をサブクエリGROUP BY parentIdに配置してGROUP_CONCAT()から、サブクエリで を使用しLEFT JOINます。GROUP BY parentIdこれらの値と等しい場合nullは無視されるため、結果は返されません。

SELECT  a.`storeID`, 
        a.`typeID`, 
        a.`cost`, 
        a.`quantity` , 
        `reqItems` 
FROM    lpStore a
LEFT JOIN
(
  select  parentID,
     GROUP_CONCAT( CONCAT( quantity,  " x ", typeID ) ) AS  `reqItems` 
  from lpRequiredItems
  group by parentID
) c 
  ON ( a.storeID = c.parentID ) 
ORDER   BY  a.`storeID`, 
        a.`typeID`, 
        a.`cost`, 
        a.`quantity`
LIMIT 0 , 30

デモで SQL Fiddle を参照してください

結果は次のとおりです。

| STOREID | TYPEID | COST | QUANTITY |                    REQITEMS |
--------------------------------------------------------------------
|       1 |   2514 | 2000 |        3 |          5 x 3668,10 x 4825 |
|       2 |   3199 | 1000 |        1 |                      (null) |
|       3 |   8785 | 5000 |        2 | 5 x 9813,1 x 4875,15 x 1102 |
|       4 |    579 | 1500 |        5 |                      (null) |
于 2013-01-28T17:27:58.960 に答える
0

LEFT JOIN代わりに使用する必要がありますINNER JOIN

SELECT  a.`storeID`, 
        a.`typeID`, 
        a.`cost`, 
        a.`quantity` , 
        GROUP_CONCAT( CONCAT( c.quantity,  " x ", c.typeID ) ) AS  `reqItems` 
FROM    lpStore a
        LEFT JOIN lpRequiredItems c 
            ON ( a.storeID = c.parentID ) 
GROUP   BY c.parentID
ORDER   BY  a.`storeID`, 
        a.`typeID`, 
        a.`cost`, 
        a.`quantity` 
LIMIT 0 , 30
于 2013-01-28T08:32:04.313 に答える
0

問題は「内部結合」です。これは、一致する値、つまり「必須」テーブルのエントリのみを返します。代わりに左結合を試してください。

SELECT a.*, b.typeName, GROUP_CONCAT(CONCAT(c.quantity, " x ", d.typeName)) as `reqItems`
        FROM lpStore a 
        INNER JOIN typeNames b ON (a.typeID = b.typeID)
        LEFT JOIN lpRequiredItems c ON (a.storeID = c.parentID)
        INNER JOIN typeNames ON (d.typeID = c.typeID)
        GROUP BY c.parentID
        ORDER BY a.cost ASC 
于 2013-01-28T06:57:02.560 に答える