我在MySQL中有一个学生信息表,看起来像这样(简化):
| age : int | city : text | name : text |
-----------------------------------------------------
| | | |
我希望选择某个城市内的所有学生姓名和年龄,以及每个学生,选择其年龄组中有多少其他学生(即,有多少学生分享他的年龄值)。
我设法用子查询做到了这一点;类似的东西:
select
name,
age as a,
(select
count(age)
from
tbl_students
where
age == a)
from
tbl_students
where
city = 'ny'
但它似乎有点慢,而且我不是SQL-wiz,所以我想我会问是否有更聪明的方法来做到这一点。该表按年龄和城市编制索引。
答案 0 :(得分:5)
select
t1.name,
t1.age as a,
count(t2.age) NumberSameAge
from
tbl_students t1 inner join tbl_students t2
on t1.age=t2.age
where
city = 'ny'
group by t1.name, t1.age
未经测试,但有类似的东西。 I.o.w.加入的groupby。这有时会更快,因为您正在运行的查询正在为返回的每个行执行嵌套子查询,而我上面发布的查询(或者至少是带有join和groupby的结构)执行只对一次相关学生的查询。
答案 1 :(得分:1)
抓取一次抓取所有内容的子查询可能更容易(相对于1000次运行子查询1000次)。
SELECT Age, count(*) AS SameAge FROM tbl_students
进行完整查询:
SELECT t.Name, t.Age, s.SameAge
FROM tbl_students t
INNER JOIN (
SELECT Age, count(*) AS SameAge FROM tbl_students
) AS s
ON (t.Age = s.Age) -- m:1
WHERE t.City = 'NY'