select max(tab2.id),a.name,b.name,b.time from tab1 a,tab2 b where a.tid=b.tid group by a.tid;
问题我已经说过了,麻烦写之前先自己试验下。 如果你写成select a.name , b.name, b.time from tab1 a, tab2 b where a.tid=b.tid group by b.tid order by b.time desc;我可能还会去试试真是。
to johnpanq(飞花逐月):你用max 只能对用这个函数的字段有效,不能针对整个记录,也就是实际上b.name,b.time仍然不是最新的。
如果以时间为准 select max(b.time),a.name,b.name from tab1 a,tab2 b where a.tid=b.tid group by a.tid;
to johnpanq(飞花逐月): 不是这个问题select max(b.id),a.name,b.name,b.time from tab1 a,tab2 b where a.tid=b.tid group by a.tid; 结果: max( b.id ) name name time 3 分类1 例子1 2005-12-15 13:51:00 4 分类2 例子2 2005-12-15 13:52:00 select max(b.time),a.name,b.name from tab1 a,tab2 b where a.tid=b.tid group by a.tid; 结果: name name max( b.time ) 分类1 例子1 2005-12-15 13:53:00 分类2 例子2 2005-12-15 13:54:00 而我想要的是 分类1 例子3 2005-12-15 13:53:00 分类2 例子4 2005-12-15 13:54:00
我要的是time 最新的的整条记录,而不是它的某个最大值
怎么又是这个问题,MYSQL手册8.3.2 拥有某个列的最大值的行 “找出最贵的文章的编号、商人和价格”在ANSI-SQL中这很容易用一个子查询做到: SELECT article, dealer, price FROM shop WHERE price=(SELECT MAX(price) FROM shop)在MySQL中(还没有子查询)就用2步做到: 用一个SELECT语句从表中得到最大值。 使用该值编出实际的查询: SELECT article, dealer, price FROM shop WHERE price=19.95另一个解决方案是按价格降序排序所有行并用MySQL特定LIMIT子句只得到的第一行: SELECT article, dealer, price FROM shop ORDER BY price DESC LIMIT 1注意:如果有多个最贵的文章( 例如每个19.95),LIMIT解决方案仅仅显示他们之一!
8.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)。见8.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 | +---------+--------+-------+最后例子当然能通过在客户程序中分割连结的列使它更有效一点。
:) 大大们,呵呵,首先如果需要创建临时表的话,那么我想方法很多,呵呵。我也知道怎么解决。另外,子查询我是没有办法的,实际情况不允许,并且我忘了说了,还要count(b.tid), hehe 我的问题主要是希望通过简单的方法实现它。临时表不难,但是临时表很讨厌,会增加不少消耗。我想出现这个问题应该是mysql的不足吧。 因为它在group的时候是默认的选择了第一条记录去做的group后的数据,而不能有选择性的选区,或者说不能倒序的选取,再或者是按照给定的恶某个字段的某个值得到想要的那条记录。 本来觉得这是不是自己对它的不了解所致,其实它有这样的参数或者技巧。 但查看了手册没有发现有这样的参数 另外,to ice_berg16(寻梦的稻草人): 想说点看法,不说不快。。不是针对大大你的,是针对你贴的文章的作者。 “ 在ANSI-SQL中这很容易用一个子查询做到: SELECT article, dealer, price FROM shop WHERE price=(SELECT MAX(price) FROM shop) ”很讨厌作者的这种说法,语句容不容易写并不代表它本身容易与否,毕竟它耗费了额外的资源。如果这样我还不如说想赚钱很容易,拼命去赚就是了 呵呵,就事论事。 个人觉得这些东西不是我能写出来就行,如果应用上有环境限制、性能限制,那么我想这些方法 都不咋地! 如果mysql本身支持这种选择就什么问题都没有了
mysql不能直接满足你的要求,所以手册中才会有那样的字句。 至少mysql是承认自己的不足的,而你不是!临时表将在连接关闭时自行销毁在ANSI-SQL中这很容易用一个子查询做到: SELECT article, dealer, price FROM shop WHERE price=(SELECT MAX(price) FROM shop) ” 是使用的子查询 但是你已经说了不用子查询 况且子查询也是需要额外的资源的,与临时表一样
如果你写成select a.name , b.name, b.time from tab1 a, tab2 b where a.tid=b.tid group by b.tid order by b.time desc;我可能还会去试试真是。
select max(b.time),a.name,b.name from tab1 a,tab2 b where a.tid=b.tid group by a.tid;
to johnpanq(飞花逐月):
不是这个问题select max(b.id),a.name,b.name,b.time from tab1 a,tab2 b where a.tid=b.tid group by a.tid;
结果:
max( b.id ) name name time
3 分类1 例子1 2005-12-15 13:51:00
4 分类2 例子2 2005-12-15 13:52:00 select max(b.time),a.name,b.name from tab1 a,tab2 b where a.tid=b.tid group by a.tid;
结果:
name name max( b.time )
分类1 例子1 2005-12-15 13:53:00
分类2 例子2 2005-12-15 13:54:00
而我想要的是
分类1 例子3 2005-12-15 13:53:00
分类2 例子4 2005-12-15 13:54:00
“找出最贵的文章的编号、商人和价格”在ANSI-SQL中这很容易用一个子查询做到: SELECT article, dealer, price
FROM shop
WHERE price=(SELECT MAX(price) FROM shop)在MySQL中(还没有子查询)就用2步做到: 用一个SELECT语句从表中得到最大值。
使用该值编出实际的查询:
SELECT article, dealer, price
FROM shop
WHERE price=19.95另一个解决方案是按价格降序排序所有行并用MySQL特定LIMIT子句只得到的第一行: SELECT article, dealer, price
FROM shop
ORDER BY price DESC
LIMIT 1注意:如果有多个最贵的文章( 例如每个19.95),LIMIT解决方案仅仅显示他们之一!
“对每篇文章,找出有最贵的价格的交易者。” 在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)。见8.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 |
+---------+--------+-------+最后例子当然能通过在客户程序中分割连结的列使它更有效一点。
大大们,呵呵,首先如果需要创建临时表的话,那么我想方法很多,呵呵。我也知道怎么解决。另外,子查询我是没有办法的,实际情况不允许,并且我忘了说了,还要count(b.tid), hehe 我的问题主要是希望通过简单的方法实现它。临时表不难,但是临时表很讨厌,会增加不少消耗。我想出现这个问题应该是mysql的不足吧。
因为它在group的时候是默认的选择了第一条记录去做的group后的数据,而不能有选择性的选区,或者说不能倒序的选取,再或者是按照给定的恶某个字段的某个值得到想要的那条记录。
本来觉得这是不是自己对它的不了解所致,其实它有这样的参数或者技巧。
但查看了手册没有发现有这样的参数
另外,to ice_berg16(寻梦的稻草人):
想说点看法,不说不快。。不是针对大大你的,是针对你贴的文章的作者。
“
在ANSI-SQL中这很容易用一个子查询做到:
SELECT article, dealer, price
FROM shop
WHERE price=(SELECT MAX(price) FROM shop)
”很讨厌作者的这种说法,语句容不容易写并不代表它本身容易与否,毕竟它耗费了额外的资源。如果这样我还不如说想赚钱很容易,拼命去赚就是了
呵呵,就事论事。
个人觉得这些东西不是我能写出来就行,如果应用上有环境限制、性能限制,那么我想这些方法
都不咋地!
如果mysql本身支持这种选择就什么问题都没有了
至少mysql是承认自己的不足的,而你不是!临时表将在连接关闭时自行销毁在ANSI-SQL中这很容易用一个子查询做到:
SELECT article, dealer, price
FROM shop
WHERE price=(SELECT MAX(price) FROM shop)
”
是使用的子查询
但是你已经说了不用子查询
况且子查询也是需要额外的资源的,与临时表一样
我是觉得在group 的时候没有参数指定选择显示哪条记录这样的选项是不完善的,质疑。我只是纯粹的想通过这种方式去找到更好的办法,没别的意思,也许多了些感慨。
呵呵。。就像能不用left join,能不用临时表,能不用子查询我都不想用,呵呵,难道这个习惯不好么?:)我认为只要写出来了就不再管它了的作法反而不太好。也许我现在懂得不多,懂得很少,但我不希望我所掌握的似是而非,大概是想知其然并且也想知其所以然吧。哈哈谢谢各位大大,
绝对没有对大家的什么看法,
大大们能帮我出出主意解决问题就已经很照顾新人了。呵呵,感谢感谢。
仅仅是个人在讨论问题过于认真兼且脾气不好,呵呵。道歉道歉。