这条SQL语句应该怎么写?

willko 2007-08-15 09:31:30
mysql> select * from a;
+----+-----+---------------------+
| id | bid | time |
+----+-----+---------------------+
| 1 | 1 | 2007-08-10 01:40:31 |
| 2 | 1 | 2007-08-15 01:34:11 |
| 3 | 3 | 2007-08-10 01:49:27 |
| 4 | 3 | 2007-08-10 01:49:27 |
+----+-----+---------------------+

mysql> select * from b;
+----+--------+
| id | name |
+----+--------+
| 1 | willko |
| 2 | willko |
| 3 | willko |
+----+--------+

a.bid外联b.id,一(b)对多(a)
现在要统计出b有多少条记录最近2天没有在b中插入新记录
这里表b id为1种有新记录,所以不算
而id为2在表a中没有记录,所以算一条
id为3在表中的记录是5天前的,所以算一条
结果为2条。
mysql是4的

谢谢了~~第一次写这种SQL~~自己也在看书··

sql~~

CREATE TABLE `a` (
`id` int(11) NOT NULL auto_increment,
`bid` int(11) NOT NULL,
`time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `bid` (`bid`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 AUTO_INCREMENT=5 ;

INSERT INTO `a` (`id`, `bid`, `time`) VALUES (1, 1, '2007-08-10 01:40:31'),
(2, 1, '2007-08-15 01:34:11'),
(3, 3, '2007-08-10 01:49:27'),
(4, 3, '2007-08-10 01:49:27');

CREATE TABLE `b` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(10) NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 AUTO_INCREMENT=4 ;

INSERT INTO `b` (`id`, `name`) VALUES (1, 'willko'),
(2, 'willko'),
(3, 'willko');
...全文
320 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
TonyZeus 2007-08-16
  • 打赏
  • 举报
回复
我不太清楚你的意思,凭我自己的理解写了一段,看下是否满足你的条件

SELECT * FROM a RIGHT JOIN b
ON a.bid = b.id
WHERE a.time IS NULL or a.time < DATE_ADD(CURDATE(),INTERVAL -2 DAY);

如果对的话,给点小分我啊,嘿嘿
willko 2007-08-16
  • 打赏
  • 举报
回复
最新的~~~在5上测试的~~效率不知怎样。。。
表a增加了索引
ALTER TABLE `a` DROP INDEX `bid` ,
ADD INDEX `bid` ( `bid` , `time` )


EXPLAIN SELECT SQL_CALC_FOUND_ROWS max( a.time )
FROM `b`
LEFT JOIN a ON a.bid = b.id
WHERE b.name = 'willko'
AND (
a.bid IS NULL
OR (
to_days( now( ) ) - to_days( a.time )
) >=1
AND (
to_days( now( ) ) - to_days( a.time )
) <=4
)
GROUP BY a.bid

请问这个还可以优化吗?
+----+-------------+-------+------+---------------+------+---------+-----------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+-----------+------+----------------------------------------------+
| 1 | SIMPLE | b | ref | name | name | 22 | const | 2 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | a | ref | bid | bid | 4 | test.b.id | 1 | Using where; Using index |
+----+-------------+-------+------+---------------+------+---------+-----------+------+----------------------------------------------+ |
+----+-------------+-------+------+---------------+------+---------+-----------+------+----------------------------------------------+
willko 2007-08-15
  • 打赏
  • 举报
回复
恩~~
打算查2此了。。
先查询A种的记录,然后放在内存,,因为需要多次用到。。。。。。。

我听我公司的前辈说mysql4用in可能会错误,数据多的时候。。不知道是不是真的~~
wildlily980 2007-08-15
  • 打赏
  • 举报
回复
失误失误.
那就等高手来吧.
willko 2007-08-15
  • 打赏
  • 举报
回复
分数只要灌水多就行了~~~
我钻牛角尖了,想在不支持子查询下用一句搞掂。。
而且实际应用比这个复杂多了,数据很大,,我需要考虑的东西比较多。。
我承认我菜~~~
zhys9 2007-08-15
  • 打赏
  • 举报
回复
楼上啊。。。
看一下mysql版本啊~
楼主都提醒两次了,mysql4不支持子查询。完毕!
在不支持子查询的情况下楼主还是考虑查两次吧。
wildlily980 2007-08-15
  • 打赏
  • 举报
回复
你php版都5个三角星了.比我还多,怎么会不知道in可以用exists代替?
wildlily980 2007-08-15
  • 打赏
  • 举报
回复
mysql> select count(*) from b where not exists(select distinct bid from
a where a.time>'2007-8-13' and b.id=a.bid);
兄弟,挣你分太不容易了.
你不会自己改写下么?
willko 2007-08-15
  • 打赏
  • 举报
回复
看来要查询2次才行了。。。继续学习最好的方案
谢谢前面2位兄弟~~
willko 2007-08-15
  • 打赏
  • 举报
回复
to wildlily980:~~
谢谢,,但是sql~~不支持子查询~~
willko 2007-08-15
  • 打赏
  • 举报
回复
现在要统计出b有多少条记录最近2天没有在b中插入新记录
=============
这句话有点奇怪,
还有一点,b中的name都相同么?

我表达能力不好吧。
b中的name不一定相同,我只是举例子。。
b和另外一张表是多对一的关系。。。不过这个不重要~~~

写错了。。。应该是 现在要统计出b有多少条记录最近2天没有在a中插入新记录
zhys9 2007-08-15
  • 打赏
  • 举报
回复
楼上看清楚点....
"mysql是4的"
wildlily980 2007-08-15
  • 打赏
  • 举报
回复
怎么样啊,楼主,行了就放分吧.
呵呵.
wildlily980 2007-08-15
  • 打赏
  • 举报
回复
mysql> select count(*) from b where b.id not in(select distinct bid from a where
a.time>'2007-8-13');
+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (0.02 sec)
zhys9 2007-08-15
  • 打赏
  • 举报
回复
现在要统计出b有多少条记录最近2天没有在b中插入新记录
=============
这句话有点奇怪,
还有一点,b中的name都相同么?
willko 2007-08-15
  • 打赏
  • 举报
回复
这个是我写的
难点在于怎么解决a记录中既符合2天内的条件,但又有记录在2天前的
SELECT * FROM `b`left join a on a.bid = b.id where b.name='willko' and (a.bid is null or a.time < '2007-8-13') group by b.id

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧