1

私のテーブルレイアウトの簡略版は次のとおりです。

テーブルアイテム

+----+-------+-----+
| ID | sdesc | ... |
+----+-------+-----+
|  1 | item1 | ... |
+----+-------+-----+

table itemaffectTable (数量のあるプロパティについては、これらの qProps を呼び出します)

+--------+---------+----------+
| itemID | affectID| quantity |
+--------+---------+----------+
|      1 |       2 |       10 | // item 1 has affect 2 for a value of 10
|      1 |       3 |        2 | // item 1 has affect 3 for a value of 2
|      2 |       1 |        5 | // item 2 gets aff 1 for 5
|      2 |       1 |        6 | // item 2 gets aff 1 for 6 which means 11 total
|      3 |       5 |        5 | 
+--------+---------+----------+

table itemaffectbyTable (存在する場合は関連するこれらの bProps を呼び出します)

+--------+---------+
| itemID | affbyID |
+--------+---------+
|      1 |       6 |
|      3 |       2 |
|      3 |       3 |
+--------+---------+

出力例:

itemID  sdesc           qpropID value   bpropID
1221    a copper lantern      4     2   5
1221    a copper lantern     18     2   5
1221    a copper lantern     17    -5   5
 477    a shade              19     3   4
 477    a shade              19     3   6

これは 2 つの点で正しくありません。最初のアイテムでは、affectbyID 5 が 3 回繰り返されます...これは許容範囲です。2 番目のケースでは、影響 ID 19 と影響値 3 が 2 回繰り返されていますが、これは許可されていません。

理想的には見たい

itemID  sdesc           qpropID value   bpropID
1221    a copper lantern      4     2   5
1221    a copper lantern     18     2   NULL
1221    a copper lantern     17    -5   NULL
 477    a shade              19     3   4
 477    a shade            NULL  NULL   6

主な問題は、qpropID と値が加算されるため、それらが繰り返されることです。ソリューションが bpropID を繰り返す場合、大した問題ではありません。

** アップデート **

FULL JOIN のアイデアを使用して結果を取得しようとしましたが、ゼロにできなかったようです。

私が望む結果に最も近いのは、sqlFiddleを使用して取得したことです

select i.id, i.sdesc, iaft.affectID, iaft.amount, NULL FROM item i
    LEFT JOIN itemaffectTable iaft ON i.id=iaft.itemID
UNION
select i.id, i.sdesc, NULL, NULL, iafbt.affectbyID FROM item i
    LEFT JOIN itemaffectedbyTable iafbt ON i.id=iafbt.itemID
ORDER BY id

要点は、フィルタの基準を満たすアイテムのリストを取得し、それらのアイテムを関連するeffectIDおよびaffectbyIDと照合することです。

オリジナルは以下。

SELECT DISTINCT i.id, i.sdesc, iaft.affectID, iaft.amount, iafbt.affectbyID FROM item i
INNER JOIN itemwearTable iwt ON i.id=iwt.itemID 
    LEFT JOIN itemaffectTable iaft ON i.id=iaft.itemID
    LEFT JOIN itemaffectedbyTable iafbt ON i.id=iafbt.itemID
LEFT JOIN itemalignTable iat ON i.id = iat.itemID
LEFT JOIN itemgenderTable igt ON i.id = igt.itemID
LEFT JOIN itemgenreTable igrt ON i.id = igrt.itemID
LEFT JOIN itemclassTable ict ON i.id = ict.itemID
LEFT JOIN itemraceTable irt ON i.id = irt.itemID
WHERE (iat.itemID IS NULL OR iat.alignID = 1)
AND (igt.itemID IS NULL OR igt.genderID = 1)
AND (igrt.itemID IS NULL OR igrt.genreID = 1)
AND (ict.itemID IS NULL OR ict.classID = 1)
AND (irt.itemID IS NULL OR irt.raceID = 1)
AND i.minlvl <= 50
AND iwt.wearlocID=1
ORDER BY sdesc
4

3 に答える 3

1

ここを見てください。私はこれがあなたが探しているものだと信じています。SSMSではこれを完全結合で解決しますが、明らかにmysqlではそれができないため、右と左の外部結合を結合するにはユニオンが必要です。

http://www.tutorialspoint.com/sql/sql-full-joins.htm

于 2013-07-24T02:31:54.653 に答える
0

期待した結果が得られません...私にはかなり不合理に思えます。

アイテムごとに、item-affect と item-affectedBy を別々に取得し、結果を行ベースの方法で結合したいとしますか? つまり、最初の結果の項目 A の行 1 は、2 番目の結果の項目 A の行 1 と一緒に配置されます。

Item     Affect               Item     AffectedBy
 1         a                    1         r
 1         b                    
 2         c                    2         s
                                2         t
 3         d
                                4         u
 5         e                    5         v
 5         f                    5         w

次のようなものを見たい:

Item    Affect    AffectedBy
1         a          r
1         b          NULL
2         c          s
2         NULL       t
3         d          NULL
4         NULL       u
5         e          v
5         f          w

右?

もしそうなら、あなたが考えることができる最も簡単な方法は、最初に item-affect の結果を次のようにすることです:

Item     Affect   seq
 1         a        1
 1         b        2
 2         c        1 
 3         d        1
 5         e        1
 5         f        2

Seq 列は、アイテムのグループ内の「ランク」です。item-affectedBy で同様のことを行う

次に、item 列と seq 列で完全外部結合を実行します。

MySQL でこれらを実現する方法がわかりません。Oracle では、seq を生成する方法は次のようになります。

select item_id, affect_id, rank() over (partition by item_id order by rownum) rank
from item_affect
order by item_id, rank;

MySQL で同様のことができるかどうか考えてみてください。

完全外部結合の場合、サポートされていない場合は、常に左結合と右結合でユニオンを実行できます。

于 2013-07-24T03:42:40.110 に答える