<script type="text/javascript">
</script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript">
</script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
一些例子使用表“shop”,包含某个商人的每篇文章(物品号)的价格。假定每个商人的每篇文章有一个单独的固定价格,那么(物品,商人)是记录的主键。
你能这样创建例子数据库表:
CREATETABLEshop(articleINT(4)UNSIGNEDZEROFILLDEFAULT'0000'NOTNULL,dealerCHAR(20)DEFAULT''NOTNULL,priceDOUBLE(16,2)DEFAULT'0.00'NOTNULL,PRIMARYKEY(article,dealer));INSERTINTOshopVALUES(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69),(3,'D',1.25),(4,'D',19.95);
好了,例子数据是这样的:
SELECT*FROMshop+---------+--------+-------+|article|dealer|price|+---------+--------+-------+|0001|A|3.45||0001|B|3.99||0002|A|10.99||0003|B|1.45||0003|C|1.69||0003|D|1.25||0004|D|19.95|+---------+--------+-------+
“最大的物品号是什么?”
SELECTMAX(article)ASarticleFROMshop+---------+|article|+---------+|4|+---------+
“找出最贵的文章的编号、商人和价格”
在ANSI-SQL中这很容易用一个子查询做到:
SELECTarticle,dealer,priceFROMshopWHEREprice=(SELECTMAX(price)FROMshop)
-
用一个
语句从表中得到最大值。使用该值编出实际的 查询:
SELECTarticle,dealer,priceFROMshopWHEREprice=19.95
另一个解决方案是按价格降序排序所有行并用MySQL特定子句只得到的第一行:
SELECTarticle,dealer,priceFROMshopORDERBYpriceDESCLIMIT1
注意:如果有多个最贵的文章(例如每个19.95)解决方案仅仅显示他们之一!
“每篇文章的最高的价格是什么?”
SELECTarticle,MAX(price)ASpriceFROMshopGROUPBYarticle+---------+-------+|article|price|+---------+-------+|0001|3.99||0002|10.99||0003|1.69||0004|19.95|+---------+-------+
“对每篇文章,找出有最贵的价格的交易者。”
在中,我可以用这样一个子查询做到:
SELECTarticle,dealer,priceFROMshops1WHEREprice=(SELECTMAX(s2.price)FROMshops2WHEREs1.article=s2.article)
在MySQL中,最好是分几步做到:
- 得到一个表(文章,maxprice)。见。对每篇文章,得到对应于存储最大价格的行。
这可以很容易用一个临时表做到:
CREATETEMPORARYTABLEtmp(articleINT(4)UNSIGNEDZEROFILLDEFAULT'0000'NOTNULL,priceDOUBLE(16,2)DEFAULT'0.00'NOTNULL);LOCKTABLESarticleread;INSERTINTOtmpSELECTarticle,MAX(price)FROMshopGROUPBYarticle;SELECTarticle,dealer,priceFROMshop,tmpWHEREshop.article=tmp.articelANDshop.price=tmp.price;UNLOCKTABLES;DROPTABLEtmp;
如果你不使用一个表,你也必须锁定“tmp”表。
“它能一个单个查询做到吗?”
是的,但是只有使用我称之为“MAX-CONCAT诡计”的一个相当低效的诡计:上一页
<script type="text/javascript">
</script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript">
</script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>