[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Задача по MySQL "query"
Страницы: 1, 2, 3
kjdgh
Осилил лишь средствами php. Никогда не работал с запросами такой сложности.

<?
//-----Коннект
$link = mysql_connect('localhost', 'root', '');
mysql_select_db('test', $link);

//-----Средние з/п в каждом из отделов
$res = mysql_query("SELECT avg(salary), dept_id FROM t_empl, t_asnmt WHERE t_empl.id=t_asnmt.empl_id GROUP BY dept_id");

//-----В каждом отделении находим работника с з/п болше среднего
while ($row = mysql_fetch_array($res) ){

$data = mysql_query("SELECT name, salary
FROM (
SELECT t_empl.id, name, salary, manager_id, empl_id, dept_id
FROM t_empl
LEFT OUTER JOIN t_dept ON t_empl.id = t_dept.manager_id
LEFT OUTER JOIN t_asnmt ON t_empl.id = t_asnmt.empl_id
) AS fullchart

WHERE Salary > '"
.$row['avg(salary)']."' AND dept_id = '".$row['dept_id']."'");
while ($data_1 = mysql_fetch_array($data)){
echo $data_1['name'].'|'.$data_1['salary'].'<br>';
}
}

?>

Может и получится запихнуть всё это в 1 запрос всякими IN(), но мне не по силам)

_____________
Новичек в программировании и вообще не разбираюсь в этом, так что не вините.



Valeriya12
Прежде всего, хочу сказать, что ценю вашу помощь. А во-вторых, с PHP это немножко нечестно wink.gif Я и не знала, что это то, что Вы имели в виду когда спрашивали "а обязательно в 1 запросе?"

Кстати, я только что видела то, что Вы написали у подписи . Вы тоже новичек? Ну Вы даете... Я чуть было не подумала, что это так.

Ну, ладно, тогда я стараюсь сама. Опять - огромное спасибо!
inpost
kjdgh
Обычные скобки для подзапроса, всё в одном уместится же:
`salery` > (SELECT avg(salary) FROM t_empl, t_asnmt WHERE t_empl.id=t_asnmt.empl_id GROUP BY dept_id)
И т.д. Правда не лучший вариант, так как нужно будет 2 однотипных запроса пилить. А ещё круче, если бы подзапрос создавал переменные, а уже эти переменные и подставлялись.

Valeriya12
А что это за такое безумное задание, что всё в одном запросе уместить надо? Так, на всякий случай к сведению, в одном запросе всё будет работать значительно медленнее и тяжелее для MySQL. Может пригодится...

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Valeriya12
Получила!

SELECT name, t_asnmt.dept_id, salary FROM t_empl, t_asnmt,(SELECT avg(salary) averagesalary, dept_id FROM t_empl, t_asnmt WHERE t_empl.id=t_asnmt.empl_id GROUP BY dept_id) as avgsaltable WHERE t_empl.id=t_asnmt.empl_id AND t_asnmt.dept_id=avgsaltable.dept_id AND salary>averagesalary


inpost - Погодите! Я только что видела, что Вы ответили. Скоро запишу ответ.
Valeriya12
inpost,

Ну, Вы хотите сказать, что вложенный запрос все-таки считается один запрос? И, что лучше кодировать такие запроси с помощью PHP потому, что это быстрее?

Кстати, как насчет моего решения которое написано выше? По-моему очень изыскано. Честно, я еще не изучила как соединять PHP и MySQL, это случится завтра. smile.gif

И для официального оглашения - Задание и условие решил учитель. Может быть и безумное. Когда узнаю больше о SQL/MySQL узнаю безумное ли было.
S.Chushkin
Вторая задача решается так (примерно; предполагаю, что по задаче руководители отделов не учитываются в расчётах):
select t.* , e.*
from (select a.dept_id, avg(e.salary) salary
from t_asnmt a, t_empl e
where not exists(select true from t_dept where manager_id = a.empl_id) and e.id = a.empl_id
group by a.dept_id) t
inner join t_asnmt a on a.dept_id = t.dept_id and not exists(select true from t_dept where manager_id = a.empl_id)
inner join t_empl e on e.id = a.empl_id and e.salary > t.salary

Результат:
"0A01"	"4500.0000"	"2"	"Jane Doe"	"6000"

п.с.
inpost прав - эффективность запросов низкая из-за структуры БД, но для обучения самый раз.
Хотя ... несколько тысяч работников на предприятие проглотит без проблем.
п.п.с.
Кстати, для обучения лучше использовать явно описанный inner join - так нагляднее, понятнее.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
S.Chushkin
Правильный запрос для первой задачи что-то вроде:
  select distinct m.*
from t_empl e, t_asnmt a, t_dept d, t_empl m
where
e.salary = (select max(salary) salary from t_empl where not exists(select true from t_dept where manager_id = t_empl.id)) and
a.empl_id = e.id and d.id = a.dept_id and m.id = d.manager_id

п.с.
Управляющих может быть несколько, т.к. макс. з/п может быть одинаковая у нескольких отделов.
п.п.с.
Странный у Вас преподаватель. В принципе, запросы не простые для только только начинающих.
Поэтому, собственно, и влез в эту тему. :)

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
inpost
S.Chushkin
Дорогие детишки 8-а класса, а не изобрести ли нам сегодня на уроке труда ядерный реактор? laugh.gif laugh.gif laugh.gif

Valeriya12
Несколько мелких запросов, и данные связывать на ПХП будет всё же быстрее работать, чем один сложный с подзапросами.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
S.Chushkin
Цитата (inpost @ 24.06.2014 - 02:21)
Несколько мелких запросов, и данные связывать на ПХП будет всё же быстрее работать, чем один сложный с подзапросами.

Не всегда - зависит от конкретики.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.