Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: двухтабличный запрос (книги, издательства)
 
 автор: esboy   (22.05.2009 в 19:56)   письмо автору
 
 

дана база

Издательство P(Pid, Pname, City)
Книга T(Tid, Pid,Tname, cena, Type,DataPubl)

1. определить издательство, в котором опубликовано больше всего книг

2. Выбрать те типы книг, средняя цена дешевых экземпляров(стоимостью менее 100 руб)
которых меньше 70 рублей.

P.S. limit ( x , y ) не использовать

  Ответить  
 
 автор: 5465645   (22.05.2009 в 23:37)
 
   для: esboy   (22.05.2009 в 19:56)
 

1. SELECT * FROM (SELECT `P`.*, COUNT(`T`.`Tid`) AS `cnt` FROM `P` LEFT JOIN `T` ON `P`.`Pid` = `T`.`Pid` GROUP BY `P`.`Pid` ORDER BY `cnt` DESC) AS `t` LIMIT 1;
2. SELECT `type`, AVG(`cena`) AS `avg_price` FROM `T` GROUP BY `type` HAVING `avg_price` < 70

  Ответить  
 
 автор: 23423423   (22.05.2009 в 23:42)
 
   для: 5465645   (22.05.2009 в 23:37)
 

Только во втором я не учёл условие < 100:
2. SELECT `Type`, AVG(`cena`) AS `avg_price` FROM (SELECT `Type`, `cena` FROM `T` WHERE `cena` < 100) AS `t` GROUP BY `Type` HAVING `avg_price` < 70

  Ответить  
 
 автор: Trianon   (22.05.2009 в 23:57)   письмо автору
 
   для: 23423423   (22.05.2009 в 23:42)
 

1. здесь не нужен Limit . И даже вреден, если требуется получить список всех таких издательств.
2. здесь не нужен вложенный подзапрос.

  Ответить  
 
 автор: 23123123   (23.05.2009 в 00:40)
 
   для: Trianon   (22.05.2009 в 23:57)
 

1. Так что ли ? :))

SELECT `P`.*, COUNT(`T`.`Tid`) AS `cnt` FROM `P`
LEFT JOIN `T` ON `P`.`Pid` = `T`.`Pid` GROUP BY `P`.`Pid` HAVING `cnt` =
(
SELECT MAX(`cnt`) FROM (

SELECT `P`.*, COUNT(`T`.`Tid`) AS `cnt` FROM `P`
LEFT JOIN `T` ON `P`.`Pid` = `T`.`Pid` GROUP BY `P`.`Pid`

) AS `t1`
)

2. SELECT `Type`, AVG(`Price`) AS `avg_price` FROM `T` WHERE `Price` < 100 GROUP BY `Type` HAVING `avg_price` < 70

  Ответить  
 
 автор: 234234   (23.05.2009 в 00:42)
 
   для: 23123123   (23.05.2009 в 00:40)
 

1. Ой, нет, там вложенный подзапрос, конечно, намного проще
SELECT `P`.*, COUNT(`T`.`Tid`) AS `cnt` FROM `P`
LEFT JOIN `T` ON `P`.`Pid` = `T`.`Pid` GROUP BY `P`.`Pid` HAVING `cnt` =
(
    SELECT MAX(`cnt`) FROM (

        SELECT COUNT(*) AS `cnt` FROM `T` GROUP BY `T`.`Pid`
    
    ) AS `t1`
)

  Ответить  
 
 автор: Trianon   (23.05.2009 в 01:13)   письмо автору
 
   для: 234234   (23.05.2009 в 00:42)
 

так уже более приемлемо.

  Ответить  
 
 автор: 234234   (23.05.2009 в 02:16)
 
   для: Trianon   (23.05.2009 в 01:13)
 

а можно и лучше?

  Ответить  
 
 автор: ESBoy   (24.05.2009 в 11:18)   письмо автору
 
   для: Trianon   (23.05.2009 в 01:13)
 

и так пойдет, огромное спасибо!!!!!

я многое сегодня понял)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования