SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 24.02.2014 14:36:49

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Запрос с подзапросом

Привет,

Какой-то дурацкий затык на ровном месте, не пойму, что не так:


SELECT
m.id,
t1.name as Team1Name,
mr.results,
m.dt
FROM `match` m,
  (SELECT COUNT( match_id ) results
   FROM  match_raw
   WHERE match_raw.match_id = m.id) mr
LEFT JOIN team AS t1 ON m.team1 = team1.id


Т.е. идея какая - вытаскиваем id из таблицы match, находим количество этих id в таблице match_raw и выводим как results.

Почему-то (sick) выдает Unknown column 'm.id' in 'where clause'

Заранее спасибо.

Неактивен

 

#2 24.02.2014 15:15:57

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос с подзапросом

Этот подзапрос нужно размещать в части перечисления полей (между select и from), а у вас он находится в части from.
MySQL сначала выполняет from подзапрос, помещает результат во временную таблицу, а потом уже делает джойн таблиц.

Неактивен

 

#3 24.02.2014 15:38:44

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Запрос с подзапросом

Ларчик просто открывался.

SELECT
m.id,
t1.name as Team1Name,
m.dt,
(SELECT COUNT( match_id ) results
   FROM  match_raw
   WHERE match_raw.match_id = m.id)
FROM `match` m
LEFT JOIN team AS t1 ON m.team1 = t1.id
LEFT JOIN team AS t2 ON m.team2 = t2.id


Спасибо.

Неактивен

 

#4 24.02.2014 15:42:54

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос с подзапросом

Bust_Ed написал:

Ларчик просто открывался.

Об этом я вам и писал smile

Только:
1. Зачем вам  LEFT JOIN team AS t2 ON m.team2 = t2.id ?
2. Для удобства чтения алиас обычно пишут после подзапроса, т.е.
(SELECT COUNT( match_id )
   FROM  match_raw
   WHERE match_raw.match_id = m.id) AS results

Неактивен

 

#5 24.02.2014 15:55:09

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Запрос с подзапросом

Ну я это по вашей наводке и сделал, есессьна. smile

1. У меня в match хранится id команды, а на страницу мне нужно вывести имя команды, которое хранится в team.
2. Спасибо, поправил, у меня это совсем не читабельно было. smile

Неактивен

 

#6 24.02.2014 17:12:39

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос с подзапросом

Bust_Ed написал:

1. У меня в match хранится id команды, а на страницу мне нужно вывести имя команды, которое хранится в team.

Это понятно. Вопрос в другом - зачем дважды присоединять таблицу team?
LEFT JOIN team AS t1 ON m.team1 = t1.id
LEFT JOIN team AS t2 ON m.team2 = t2.id

Если вы удалите вторую строчку, то результат запроса не изменится.

Неактивен

 

#7 25.02.2014 14:09:19

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Запрос с подзапросом

Ого. РЕально. Зачем я так делал, интересно... Наверное, потому что не подумал? smile)))

Еще раз спасибо.

Неактивен

 

#8 25.02.2014 16:08:04

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Запрос с подзапросом

Так. У меня там в верхнем запросе не хватало вот этого:

SELECT
            m.id,
            t1.name as Team1Name,
            team2,
            t2.name as Team2Name,
FROM `match` m
            LEFT JOIN team AS t1 ON m.team1 = t1.id
            LEFT JOIN team AS t2 ON m.team2 = t2.id


Подозреваю, что все-таки нужно два джоина, да? smile

Неактивен

 

#9 25.02.2014 16:13:55

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос с подзапросом

В таком варианте - да.
Только зачем именно left join? Разве может быть матч, в котором не определена одна из команд?

Неактивен

 

#10 25.02.2014 16:40:00

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Запрос с подзапросом

В смысле не определена?

Нет, если есть матч, то гарантировано команды, которые в нем участвуют есть в таблице team

Неактивен

 

#11 25.02.2014 17:33:31

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос с подзапросом

Тогда зачем вы используете LEFT JOIN, а не просто JOIN ?
Посмотрите эту тему http://sqlinfo.ru/forum/viewtopic.php?id=3210

Неактивен

 

#12 25.02.2014 17:52:42

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Запрос с подзапросом

Пошел курить мануал. Спасибо.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson