``物品ごとに最高値を付けている業者(複数可)は ?''
SQL-99(および 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 より前のバージョンでは、複数の段階に分けて実行するのが最適です。
(物品、最高値)の組み合わせの一覧を取得する。
物品ごとに、最高値を格納しているレコードを取得する。
これは、テンポラリテーブルと結合を使用すると、簡単に実行できます。
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
テーブルもロックする必要があります。
``これを 1 つのクエリで実行できますか ?''
できます。ただし、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.