П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 178764 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 76464 раз(а).

Учебник HTML.
Просмотров 74558 раз(а).

Руководство по PHP5.
Просмотров 45554 раз(а).

Хостинг через призму DNS.
Просмотров 52559 раз(а).

Подборка текстов стандартных документов.
Просмотров 45587 раз(а).

Учебник PHP - Самоучитель
Просмотров 51803 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 52283 раз(а).

Внешние атаки...
Просмотров 42339 раз(а).

Учебник PHP.
Просмотров 37753 раз(а).

SSI в примерах.
Просмотров 28106 раз(а).



 
 
| Добавить в избранное | Сделать стартовой | Помощь





Глава 3. Учебное пособие по MySQL
Пред. След.

3.5. Примеры стандартных запросов
3.5.4. Строка, содержащая максимальное значение некоторого столбца

"Для каждого изделия, как определить дилер(ов) с самыми высокими ценами?"

В ANSI SQL (и MySQL 4.1) это легко делается при помощи вложенного запроса:

SELECT article, dealer, price
FROM   shop s1
WHERE  price=(SELECT MAX(s2.price)
FROM shop s2
WHERE s1.article = s2.article);

В MySQL до 4.1 такая задача выполняется в два этапа:

  1. Следует получить список (изделие, максимальная цена)

  2. Для каждого изделия, получить соответствующие записи, в которых цена соответствует максимальной.

Это легко делается с помощью временной таблицы:

CREATE TEMPORARY TABLE tmp (
article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
price   DOUBLE(16,2) DEFAULT '0.00' NOT NULL);

LOCK TABLES shop read;

INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;

SELECT shop.article, dealer, shop.price FROM shop, tmp
WHERE shop.article=tmp.article AND shop.price=tmp.price;

UNLOCK TABLES;

DROP TABLE tmp;

Если вы не используете ключевое слово TEMPORARY, вам также следует поставить блокировку на таблицу tmp.

"А можно ли это сделать одним запросом?"

Да, но только используя совершенно неэффективный трюк, который я называю "Трюк MAX-CONCAT":

SELECT article,
 SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 7) AS dealer,
  0.00+LEFT(MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price
FROM   shop
GROUP BY article;

+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0001 | B      |  3.99 |
|    0002 | A      | 10.99 |
|    0003 | C      |  1.69 |
|    0004 | D      | 19.95 |
+---------+--------+-------+

Разумеется, последний пример можно сделать чуть эффективнее, если разбиение катенизированной строки делать на стороне клиента.


Назад Начало Главы Начало Раздела Вперед

Пред. Глава След. Глава
Глава 2. Установка MySQL Начало Книги Глава 4. Администрирование баз данных


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





Copyright © 2005-2016 Project.Net.Ru