我的表格布局的简化版本如下:
表项目
+----+-------+-----+
| 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
这在两个方面是不正确的。对于第一项,affectbyID 5重复3次......这是可以容忍的。在第二种情况下,我们有EFFID 19并且影响值3被重复两次,这是不允许的。
理想情况下,我想看看
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和值,因为它们是相加的。如果解决方案重复bpropIDs,那没什么大不了的。
**更新**
我尝试使用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
所以底线的想法是我想要检索符合过滤条件的项目列表,然后将这些项目与其关联的affectID和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
答案 0 :(得分:1)
看看这里。我相信这就是你要找的东西。在SSMS中我会用Full Join来解决这个问题,但显然你不能在mysql中这样做,所以你需要一个联合来组合右外连接和左外连接。
答案 1 :(得分:1)
这真是一个你想要的奇怪结果 - 它是一种枢转的联合或其他东西。
尽管如此,但在这里,你要求所有的花里胡哨!
select id, sdesc, affectID, amount, affectbyID
from (select
id, sdesc,
if(sameid and @affectID = affectID and @amount = amount, null, affectID) as affectID,
if(sameid and @affectID = affectID and @amount = amount, null, amount) as amount,
@affectID := affectID,
@amount := amount,
if(sameid and @affectbyID = affectbyID, null, affectbyID) as affectbyID,
@affectbyID := affectbyID
from (select
if(@id is null, false, @id = id) as sameId,
@id := id as id,
sdesc, affectID, amount, affectbyID
from (select distinct
i.id,
i.sdesc,
iaft.affectID,
iaft.amount,
iafbt.affectbyID
FROM item i
LEFT JOIN itemaffectTable iaft ON i.id=iaft.itemID
LEFT JOIN itemaffectedbyTable iafbt ON i.id=iafbt.itemID
ORDER BY 1,3,4,5
) x) y) z
这使用User Defined Variables来记住列的先前值。
为每个新id
值重置逻辑,如果列(或列对)与前一行具有相同的值,则其他列为空。
答案 2 :(得分:0)
我没有得到你预期的结果......这对我来说似乎非常不合理。
您是否想要为每个项目执行某些操作,假设您分别获得item-affect和item-affectedBy,并且您希望以基于行的方式组合结果?即,第一个结果中项目A的第1行将与第二个结果中项目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组中的“rank”。 在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中做类似的事情。
对于完全外部联接,如果不支持,您始终可以使用左右联接执行联合。