老实说,您目前拥有的这种类型的桌子设计并不是一个好主意。构建良好的关系数据库的一大重点是使用范式。我不打算解释这里是什么,因为互联网上有成千上万的文章解释它,以及它的不同迭代(从 1NF 到 6NF iirc)。
无论如何,您可以使用几张桌子轻松完成此操作。我不得不猜测你在这里的很多设置,但希望你能够推断出你需要什么,并调整不需要的东西。
首先,让我们从一个客户表开始:
CREATE TABLE dbo.Client (ClientID int IDENTITY(1,1),
ClientName varchar(100), --You should really split this into Title, Forename and Surname, I'm just being "lazy" here
ClientCountryID int, --Not sure if a Client is related to a country or the vote is, i've guessed the client is.
DOB date,
EmailAddress varchar(100));
GO
所以,我们现在有一个简单的客户表。接下来,我们需要一个国家表。这很简单:
CREATE TABLE dbo.Country (CountryID int IDENTITY(1,1),
CountryName varchar(100),
CountryCode char(2)); --For example UK for United Kingdom, FR for France, etc
GO
您可能想在此处存储其他内容,但我不知道您的设置。
现在,这就是我真正猜测的地方。我假设您的好恶等与某事有关。什么,我不知道,所以,我将有一个名为“内容”的表格,但是,不知道这些喜欢反对什么,我没有这个表格的上下文,因此它将是非常基本的:
CREATE TABLE dbo.Content (ContentID int IDENTITY(1,1),
ContentType int, --Guessing might be types, maybe videos, Comments, articles? I have no idea to be honest)
ContentParent int, --Comments are joined to a Content (just like here on SO)? I'll guess it's possible
Content nvarchar(MAX)); --because I have no idea what's going in there
--Very simple Content Type Table
CREATE TABLE dbo.ContentType (TypeID int IDENTITY(1,1),
TypeDescription varchar(100));
GO
现在,我们终于可以获取您想要存储的选票了;可能看起来像这样:
CREATE TABLE dbo.Vote (VoteID int IDENTITY(1,1),
ClientID int,
ContentID int,
Liked bit); --1 for Liked, 0 for Disliked, NULL for N/A perhaps?
GO
好的,现在我们有一些桌子。现在我意识到我没有提供任何类型的 Sample 数据进入这里,所以我将为您提供一些 INSERTS 语句,以便您了解:
INSERT INTO dbo.Country (CountryName, CountryCode)
VALUES ('United Kingdom','GB'),
('France','FR'),
('Germany','DE');
GO
INSERT INTO dbo.Client (ClientName, ClientCountryID, DOB, EmailAddress)
VALUES ('Mr John Smith',1, '19880106','Bob@gmial.com'),
('Ms Penelope Vert',2,'19930509','PVert@mfn.com');
GO
INSERT INTO dbo.ContentType (TypeDescription)
VALUES ('Video'),('Article'),('Comment');
GO
INSERT INTO dbo.Content (ContentType, ContentParent, Content)
VALUES (2, NULL, 'This is my first article, hi everyone!'),
(3, 1, 'Nice! Good to see you''re finally posting!'),
(1, NULL, 'http://youtube.com');
GO
--And now some votes:
INSERT INTO dbo.Vote (ClientID, ContentID, Liked)
VALUES (1, 1, 1),
(2, 1, 1),
(2, 2, 1),
(2, 3, 0);
GO
请注意我是如何输入投票的。我没有在表格中汇总;这样做是一个糟糕的主意。而是单独存储每个投票并使用查询来聚合。您可以轻松做到这一点,例如:
SELECT C.ContentID,
Cy.CountryName,
COUNT(CASE V.Liked WHEN 1 THEN 1 END) AS LikedVotes,
COUNT(CASE V.Liked WHEN 0 THEN 1 END) AS DisLikedVotes
FROM dbo.Content C
JOIN dbo.Vote V ON C.ContentID = V.ContentID
JOIN dbo.Client CV ON V.ClientID = CV.ClientID
JOIN dbo.Country Cy ON CV.ClientCountryID = Cy.CountryID
GROUP BY C.ContentID,
Cy.CountryName;
这会为您提供每个内容项目的点赞数,并为您将其划分为国家/地区。如果您想将这些国家/地区放入自己的列中,那么我强烈建议在您的表示层中执行此操作,而不是您的 SQL(因为您必须使用动态 SQL,并且(不冒犯)我想象一下,根据您当前的数据库设计选择,这超出了您目前的技能)。 Excel 非常擅长使用数据透视表。如果您想在 SQL Server 中保留该过程,请考虑使用 SSRS 和矩阵。
如果您有任何问题,请尽管提问。
注意:我在这里没有制作任何类型的外键、约束、默认值等。对于任何好的数据库设计来说,这些都是必不可少的。
清理脚本:
DROP TABLE dbo.Client;
DROP TABLE dbo.Country;
DROP TABLE dbo.Vote;
DROP TABLE dbo.Content;
DROP TABLE dbo.ContentType;
GO