SQL-запрос или подзапрос? - PullRequest
1 голос
/ 26 декабря 2008

У меня есть таблица информации о студентах в 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, поэтому я решил спросить, есть ли более разумный способ сделать это. Таблица индексируется по возрасту и городу.

Ответы [ 2 ]

5 голосов
/ 26 декабря 2008
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. группа в соединении. Иногда это может быть быстрее, так как выполняемый вами запрос выполняет вложенный подзапрос для каждой возвращенной строки , а запрос, который я разместил выше (или, по крайней мере, структура с объединением и групповым доступом), выполняет запрос на связанных студентов только один раз.

1 голос
/ 26 декабря 2008

Может быть проще получить подзапрос, который захватывает все сразу (вместо 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...