我正在开发一个名为Fablelane的合作写作网站,人们可以在那里创建故事。现在,系统(当人们创建故事时)检测故事的语言,并将其保存在数据库中。
在头版(http://fablelane.com),有三个“值得注意的故事”。现在,它只选择了三个投票最高的故事,带有一个简单的ORDER BY条款。
但是如果有一个故事是用用户的语言写的(假设这是丹麦语- da_DK),那么我希望这三个故事中的第一个与用户的语言相匹配,而其余的则是英语。
换句话说:
这有意义吗?如果不是,这里有几个用例。
用例1:丹麦用户访问站点,但没有丹麦故事
用例2:丹麦用户访问该站点,其中至少有一个丹麦故事可用
用例3:访问站点的英语用户
这与用例1完全相同。
编辑1
让我们简单地说,每个故事的语言都存储在一个名为VARCHAR(MAX)的Language列中,并且故事的表名为Story。
获取用户语言的方式是通过ASP.NET MVC中的Request.UserLanguages属性。换句话说,它是一个字符串。为了简化示例中的操作,让我们假设它与Language列中的Story值完全匹配。
发布于 2014-02-26 21:27:18
对你的计划一无所知..。我认为实现这一目标的一种方法可能是产生两个结果集并将它们结合起来,并从中获得前3名。不过,这可能不是最好的方法,我相信查询可以写得更好(而且可能具有更好的性能)。
可能是这样的:
// first some sample data
declare @stories table (story varchar(20), lang char(2), votes int)
insert @stories values
('Story 1', 'DK', 1),('Story 2', 'DK', 3),
('Story 3', 'EN', 4),('Story 4', 'EN', 3),
('Story 5', 'EN', 2),('Story 6', 'EN', 1)
// and the query
select top 3 * from (
(select top 1 *, 1 as ranking from @stories where lang = 'DK' order by votes desc)
union
(select top 3 *, 2 as ranking from @stories where lang = 'EN' order by votes desc)
) x
order by ranking, votes desc样品SQL Fiddle.
这当然不适合你的具体情况,但它应该给你一个方法,可以工作的想法。
发布于 2014-02-26 21:25:38
以下是您想做的事情的一种方法:
select top 3 s.*
from ((select top 1 s.*, 1 as inlang
from stories s
where s.lang = @UserLang
order by votes desc
) union all
(select s.*, 0 as inlang
from stories s
where s.lang = 'English'
)
) s
order by inlang desc, votes desc;不过,我怀疑你还没有考虑到这样一个事实:所有投票最多的故事都是用用户语言写的。
https://stackoverflow.com/questions/22053234
复制相似问题