表概述

mail_items 表记录了邮件中附带的物品关联信息。一封邮件可以附带多个物品(最多12个),每个物品在这里有一条记录。通过 item_guid 关联 item_instance 表获取物品的详细属性。

主键为 item_guid,每个物品实例只能在一封邮件中。mail_id 关联 mail 表,receiver 冗余字段加速查询。

表结构

字段名类型默认值说明
mail_idint UNSIGNED0所属邮件ID(关联mail表)
item_guidint UNSIGNED0物品实例GUID(主键,关联item_instance表)
receiverint UNSIGNED0收件人角色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条对应的记录。