这是一个例子,所以我有桌子user和桌子city,他们是这样的:
user列是(user_id,city_id,timestamp)[user_id和city_id是唯一的]
city列是(city_name,city_id)[city_id是唯一的]
我希望在某个城市的特定日期获得用户数,所以基本上我这样做了:
select city_id, city_name,
(select count(user.user_id)
from user, city
where DATE_FORMAT(user.timestamp, '%Y-%m-%d') = '2017-03-07'
and user.city_id = ct.city_id) as user_count
from city ct
where (city_id = 20 or city_id = 30)
Run Code Online (Sandbox Code Playgroud)
结果:
city_id, city_name, user_count
20 New York 100
30 LA 200
Run Code Online (Sandbox Code Playgroud)
然后我意识到这比直接搜索要慢
select count(user.user_id)
from user, city
where DATE_FORMAT(user.timestamp, '%Y-%m-%d') = '2017-03-07'
and user.city_id = 20
Run Code Online (Sandbox Code Playgroud)
为什么是这样?ct.city_id原始搜索中是不是已经设置为20或30?我应该如何优化搜索并以我想要的表格格式获得结果?
您可以改进查询,避免使用subselect并使用内部联接和分组依据
select city_id, city_name, count(user.user_id)
from user
inner join city on user.city_id = city.city_id
where DATE_FORMAT(user.timestamp, '%Y-%m-%d') = '2017-03-07'
and city_id in (city_id = 20 or city_id = 30)
group by city_id, city_name
Run Code Online (Sandbox Code Playgroud)