表概述
mail_items 表记录了邮件中附带的物品关联信息。一封邮件可以附带多个物品(最多12个),每个物品在这里有一条记录。通过 item_guid 关联 item_instance 表获取物品的详细属性。
- 邮件物品关联
- 物品实例追踪
- 收件人验证
主键为 item_guid,每个物品实例只能在一封邮件中。mail_id 关联 mail 表,receiver 冗余字段加速查询。
表结构
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| mail_id | int UNSIGNED | 0 | 所属邮件ID(关联mail表) |
| item_guid | int UNSIGNED | 0 | 物品实例GUID(主键,关联item_instance表) |
| receiver | int UNSIGNED | 0 | 收件人角色GUID(冗余字段) |
实际案例
案例1:查询某封邮件的所有附件物品
SELECT
mi.mail_id, mi.item_guid, ii.itemEntry, ii.count
FROM mail_items mi
JOIN item_instance ii ON ii.guid = mi.item_guid
WHERE mi.mail_id = 100;案例2:查询指定角色收到的所有物品邮件
SELECT
m.id AS mail_id, m.subject,
COUNT(mi.item_guid) AS item_count,
FROM_UNIXTIME(m.deliver_time) AS deliver_date
FROM mail m
JOIN mail_items mi ON mi.mail_id = m.id
WHERE mi.receiver = 100
GROUP BY m.id
ORDER BY m.deliver_time DESC;案例3:清理过期邮件中的物品数据
SELECT
mi.item_guid, ii.itemEntry,
m.id AS mail_id, m.receiver,
FROM_UNIXTIME(m.expire_time) AS expire_date
FROM mail_items mi
JOIN mail m ON m.id = mi.mail_id
JOIN item_instance ii ON ii.guid = mi.item_guid
WHERE m.expire_time < UNIX_TIMESTAMP()
ORDER BY m.expire_time;常见问题
Q1: mail_items 和 item_instance 的关系是什么?
mail_items 通过
item_guid 关联 item_instance 表的 guid 字段。item_instance 存储物品的实际属性(附魔、宝石、耐久度等),mail_items 仅记录物品属于哪封邮件。Q2: 为什么要冗余存储 receiver 字段?
receiver 字段用于加速查询。虽然通过 mail_id 关联 mail 表也能查到收件人,但冗余存储可以避免 JOIN 操作,在查询"某角色所有邮件中的物品"时效率更高。
Q3: 一封邮件最多可以附带多少个物品?
魔兽世界邮件系统限制每封邮件最多附带 12个物品。在数据库中,一封邮件在 mail_items 表中最多有12条对应的记录。