MySQL

:: DEVELOPER ZONE

Login / Register

  • MySQL.com
  • Developer Zone
  • Partners
  • Online Shop
  • Downloads
  • Documentation
  • Forums
  • Lists
  • Bugs
  • Events
  • User Groups
  • Guilds
  • Blogs
  • Support
  • Resources
  • Books
  • FAQ

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

  • Overview
  • MySQL Reference Manual
  • MaxDB Documentation
  • Connectors

Search the MySQL manual:


  • Справочное руководство по MySQL 4.0.

  • 3.5 Примеры стандартных запросов
  • 3.5.1 Максимальное значение столбца
  • 3.5.2 Строка, содержащая максимальное значение некоторого столбца
  • 3.5.3 Максимальное значение столбца для группы
  • 3.5.4 Строка, содержащая максимальное значение некоторого столбца
  • 3.5.5 Использование пользовательских переменных
  • 3.5.6 Использование внешних ключей
  • 3.5.7 Поиск по двум ключам
  • 3.5.8 Подсчет посещений за день
  • 3.5.9 Использование атрибута AUTO_INCREMENT

Get the MySQL Language Reference and MySQL Administrator's Guide from MySQL Press!


Additional languages

  • German


Learn about new MySQL releases, technical articles, events and more.

Subscribe to the monthly MySQL Newsletter!


Previous / Next / Up / Table of Contents

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 |
+---------+--------+-------+

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


This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.

Top / Previous / Next / Up / Table of Contents

© 1995-2005 MySQL AB. All rights reserved.

  • About MySQL
  • Careers
  • Site Map
  • Contact Us
  • Legal
  • Privacy Policy
  • Trademark Info
  • No Software Patents!