【发布时间】:2011-07-04 05:06:20
【问题描述】:
我的数据库中有以下架构:
| items | CREATE TABLE `items` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`description` text COLLATE utf8_unicode_ci,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
| rankings | CREATE TABLE `rankings` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`item_id` int(11) DEFAULT NULL,
`rank` int(11) DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
我基本上希望用户能够添加项目并将它们相互排名。我系统中的管理员将能够查看按平均排名排序的项目列表。我目前正在使用这样的查询来确定所有用户的平均排名:
SELECT AVG(r.rank) AS rank, i.* FROM rankings r LEFT OUTER JOIN items i ON r.item_id = i.id GROUP BY i.id ORDER BY rank ASC;
我正在苦苦挣扎的是如何在添加新项目并且尚未被任何用户排名时制定查询或插入策略。我看到的两个可行策略是:
1) 构造查询以获取所有用户的排序列表,这样未排序的项目仍会被计算在内,但可能会添加到每个用户的列表末尾,按创建日期排序
2) 添加新商品时,在排名表中为新商品的每个用户添加一行,在当前排名中排在最后
想法?
【问题讨论】:
-
+1 只是为了在您的问题中包含正确的 SHOW CREATE TABLE 输出。谢谢,谢谢。
标签: database-design database-schema