请原谅这个令人费解的例子,但我相信有一些关于sql的基本信息我缺少了,我不确定它是什么。我有这个疯狂的询问......
SELECT *
FROM (
SELECT *
FROM (
SELECT @t1 := @t1 +1 AS leaderboard_entry_youngness_rank, 1 - @t1 /100 AS
leaderboard_entry_youngness_based_on_expiry, leaderboard_entry . * ,
NOW( ) - leaderboard_entry_timestamp AS leaderboard_entry_age_in_some_units,
TO_DAYS( NOW( ) ) - TO_DAYS( leaderboard_entry_timestamp )
AS leaderboard_entry_age_in_days
FROM leaderboard_entry) AS inner_temp
NATURAL JOIN leaderboard
NATURAL JOIN user
WHERE (
leaderboard_load_key = 'sk-en-adjectives-1'
OR leaderboard_load_key = '-sk-en-adjectives-1'
)
AND leaderboard_quiz_mode = '0'
ORDER BY leaderboard_entry_age_in_some_units ASC , leaderboard_entry_timestamp ASC
LIMIT 0 , 100
) AS outer_temp
ORDER BY leaderboard_entry_elapsed_time_ms ASC , leaderboard_entry_timestamp ASC
LIMIT 0 , 50
我添加了第二个嵌套的SELECT语句,因为最外层查询中没有返回user表中的user_name。但是现在,基于行索引比率生成的leaderboard_entry_youngness_based_on_expiry字段无法正常工作。
如果删除第二个嵌套的SELECT语句,则leaderboard_entry_youngness_based_on_expiry按预期工作,但不返回user_name列。
我怎样才能满足两者?为什么会这样?
谢谢!
这源于以下问题:
答案 0 :(得分:1)
在你的内部SELECT语句中,你没有user.user_name
,这就是为什么不返回用户名的原因。删除外部查询,像之前一样执行,但使用user.user_name
,如下所示:
....
SELECT @t1 := @t1 +1 AS leaderboard_entry_youngness_rank, 1 - @t1 /100 AS
leaderboard_entry_youngness_based_on_expiry, leaderboard_entry . * ,
NOW( ) - leaderboard_entry_timestamp AS leaderboard_entry_age_in_some_units,
TO_DAYS( NOW( ) ) - TO_DAYS( leaderboard_entry_timestamp )
AS leaderboard_entry_age_in_days, user.user_name
....
答案 1 :(得分:0)
尝试在最内层的查询中放置一个ORDER BY
,因为当前没有ORDER BY
子句,错误地说“工作不正常”。
检查您是否带走了外部SELECT * FROM...
,看看是否有重复的user_name
列。
BTW,既然你没有在查询中使用行索引列,为什么不把这个逻辑放在应用程序本身?这样做会更可靠。