WEB开发网
开发学院数据库MySQL MySQL中文参考手册 - 常用查询的例子 阅读

MySQL中文参考手册 - 常用查询的例子

 2010-01-05 15:54:55 来源:WEB开发网   
核心提示:3.3 列的最大值:按组:只有值“每篇文章的最高的价格是什么?”SELECT article, MAX(price) AS priceFROM shopGROUP BY article+-+---+| article | price |+-+---+|0001 |3.99 ||0002 | 10

3.3 列的最大值:按组:只有值

“每篇文章的最高的价格是什么?”

SELECT article, MAX(price) AS price
FROM  shop
GROUP BY article
+---------+-------+
| article | price |
+---------+-------+
|  0001 | 3.99 |
|  0002 | 10.99 |
|  0003 | 1.69 |
|  0004 | 19.95 |
+---------+-------+

3.4 拥有某个字段的组间最大值的行

“对每篇文章,找出有最贵的价格的交易者。”

在ANSI SQL中,我可以用这样一个子查询做到:

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

在MySQL中,最好是分几步做到:

得到一个表(文章,maxprice)。见3.4 拥有某个域的组间最大值的行。

对每篇文章,得到对应于存储最大价格的行。

这可以很容易用一个临时表做到:

CREATE TEMPORARY TABLE tmp (
article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
price  DOUBLE(16,2)       DEFAULT '0.00' NOT NULL);
LOCK TABLES article read;
INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;
SELECT article, dealer, price FROM shop, tmp
WHERE shop.article=tmp.articel 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 |
+---------+--------+-------+

最后例子当然能通过在客户程序中分割连结的列使它更有效一点。

Tags:MySQL 参考

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接