需要MySQL约束和派生值建议
我最近开始玩数据库,试着用例子自学 我有以下问题,我目前正在努力解决,这让我很困惑,我希望有人能给我一些启示 该数据库有4个表。摄影师、图片、比赛和观众。这个概念是摄影师参加比赛。他们为每场比赛拍摄一张照片,观众对其进行评分。比赛的获胜者是得分最多的人。我提出了以下限制需要MySQL约束和派生值建议,mysql,constraints,derived,Mysql,Constraints,Derived,我最近开始玩数据库,试着用例子自学 我有以下问题,我目前正在努力解决,这让我很困惑,我希望有人能给我一些启示 该数据库有4个表。摄影师、图片、比赛和观众。这个概念是摄影师参加比赛。他们为每场比赛拍摄一张照片,观众对其进行评分。比赛的获胜者是得分最多的人。我提出了以下限制 评分在0-5之间 只有前20名观众可以投票 我不想存储摄影师的总评分,因为我想学习如何计算派生值 对于数字1和2,我不确定如何显式创建此约束。 对于数字3,我不知道如何在db上表示派生值。 我正在使用MySql 如有任何想法、建
致以最诚挚的问候1]据我所知,您无法在MySQL中直接设置此类约束。您可以将
UNSIGNED TINYINT
与允许的值0-255一起使用,但在将值插入数据库之前,您必须检查这些值是否正确
2] 我是否正确理解您希望每张图片最多只允许20票
你要么将所有的选票存储在一个单独的数据库中(然后检查已有的投票数),要么只保存平均投票数和投票数。无论哪种方式,您都必须亲自检查并确定是否允许用户投票。对于第一种选择:
SELECT COUNT(*) > 20 FROM votes
WHERE picture_id = '123'
对于第二个更简单的问题:
SELECT votes_count > 20 FROM pictures
WHERE id = '123'
3] 如果您对图片的投票直接存储在图片数据库中,只需使用SUM()函数:
SELECT *, SUM(points) as total_points FROM photographers AS ph
LEFT JOIN pictures AS pic ON pic.photographer_id = ph.id
GROUP BY p.id, competition_id
我希望我在那里没有犯错误。如果您有更详细的问题,请尽管问,我会尽力填补这些漏洞;) 1)查看
enum
值,尽管tinyint(1)unsigned
可能更快是的,enum是一种可能性,但计算总计或平均值会很麻烦。如果您的enum值代表数字enum键,计算是透明的,因为MySQL中的所有计算都是用键完成的anyways@freddy,对不起,请问您的确切意思是什么?如果您在enum中设置值,例如enum('1','2','3')
,则值在DB中表示为整数(在这种情况下为0-2)。数值转换将使用整数而不是值。诸如selectsum(enumfield)fromtest
之类的查询将返回索引的总和。有关更多信息,请参阅。@freddy K.,我知道ENUM是如何存储的,但从没想过我可以用它做这样的数学运算。我认为这很容易出错,因为系统在某种程度上是“隐藏”的,可能下一个程序员看不清楚。但不管怎么说很有趣,+1!