如何将2个sql语句组合成一个mysql中的单个查询?

时间:2011-03-09 05:21:43

标签: php mysql

我有两个复杂的ish sql语句。其中一个生成计数,另一个查询排行榜,排行榜有不同的列。在php脚本中,我只从第二个返回的查询中选择一行,然后合并第一个查询结果中的计数并将其返回给调用者。

问题:由于我对数据库进行两次查询,这会显着增加加载时间。我想结合两个查询来优化调用。

以下是我的疑问:

select count(*) as leaderboard_entry_history_tally 
from leaderboard_entry 
natural join user 
natural join leaderboard where 
(leaderboard_load_key = 'fr-en-colors' or leaderboard_load_key = '-fr-en-colors' )
and leaderboard_quiz_mode = '0' and user_id = 37

set @t1=0; select 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 , leaderboard_entry.user_id , leaderboard_entry.leaderboard_entry_id , leaderboard_entry.leaderboard_id , leaderboard_entry.leaderboard_entry_timestamp , leaderboard_entry.leaderboard_entry_friendly_load_key , leaderboard_entry.leaderboard_entry_session_uuid , leaderboard_entry.leaderboard_entry_num_mistakes , leaderboard_entry.leaderboard_entry_num_unique_cues , leaderboard_entry.leaderboard_entry_latitude , leaderboard_entry.leaderboard_entry_longitude , leaderboard_entry.leaderboard_entry_app_market_code , leaderboard.leaderboard_quiz_mode , leaderboard.leaderboard_load_key , leaderboard_entry.leaderboard_entry_elapsed_time_ms from leaderboard_entry natural join leaderboard where (leaderboard_load_key = 'fr-en-colors' or leaderboard_load_key = '-fr-en-colors' ) and leaderboard_quiz_mode = '0' and user_id in (37) order by leaderboard_entry_timestamp desc limit 0, 1

我查看了其他已发布的解决方案。其中一些使用临时表,当我尝试它时似乎不起作用(得到语法错误)。

我也尝试过嵌套查询,但即使使用以下简单的东西也无法使用它:

select 
(
select count(*) from leaderboard_entry
) , * from leaderboard_entry_timestamp

非常感谢任何帮助!

由于 猪

2 个答案:

答案 0 :(得分:3)

如果速度是您的问题,那么我会确保您的架构中定义了外键及其索引。还要确保您搜索的所有条件项都有索引。

不确定语法(我是甲骨文家伙),但也许是这样的:

如何添加外键:

ALTER TABLE leaderboard_entry ADD FOREIGN KEY(leaderboard_id)REFERENCES排行榜(leaderboard_id);

如何添加索引:

alter table leaderboard_entry 使用hash(leaderboard_id)添加索引;


此外,使用预准备语句和绑定变量也可以提供帮助。一旦完成,它将消除解析步骤。

以下是描述如何执行此操作的链接:

http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

请参阅“准备好的陈述”部分。


答案 1 :(得分:1)

  

问题:由于我对数据库进行两次查询,这会显着增加加载时间。

事实并非如此。

您的性能不佳,因为您的查询未得到很好的优化(或根本没有)。所以不要以为1个查询的速度比2快。

此外 - 您无法合并这两个查询,因为它们会返回不同数量的列。