Browsing the archives for the 数据库 category

如何在SQL中先排序后分组

in 数据库

标题说的有点奇怪,换句话说是让order by比group by先执行。还不明白对吧?
举个例子:实现场景,要实现QQ空间的动态消息,首先要按最新的消息查到QQ好友排序,然后再按好友分别查询他们的动态消息
有如下的Feed表
id userid type msg who time
1 2 add_twitter hahah 1 2010-04-27 19:12:38
2 2 add_twitter 怎么啦 2 2010-04-27 19:12:44
3 4 add_twitter asddas 3 2010-04-27 19:20:26
4 2 reply_twitter 放大法 4 2010-04-27 19:24:09
5 5 reply_twitter 噶 5 2010-04-27 19:24:13
6 3 add_twitter saf 6 2010-04-27 19:35:48
7 2 add_twitter 先谢谢谢谢谢谢 7 2010-04-27 19:54:44
现在想要,按时间先后,把用户的id查询出来,每个id只出现一次。
当然,第一时间就想到用group by语句来分组嘛

SELECT * FROM feed GROUP BY userid ORDER BY time

可是,得到的结果并不是自己想要的,group by比order by先解析了,结果就是得到最旧的那一条。
正确的方法
使用子查询

SELECT * FROM
(SELECT * FROM feed ORDER BY time) AS T
GROUP BY T.userid ORDER BY T.time

上面这句在mysql可以正常取值,但是在hibernate不能使用from 后面的子查询,杯具。。
换个折中的方法,以下方法只是为了取得userid而已

SELECT * FROM feed GROUP BY userid ORDER BY max(time)

1 Comment

Mysql指定编码创建数据库

in 数据库

mysql 创建数据库时指定编码很重要,一般都指定为统一的UTF-8编码,如果不指定编码,默认编码为lan1,插入中文时是会提示错误的,类似”\x22\x34″

CREATE DATABASE `test2` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

1 Comment

MSSQL多个外键对应同一个表时查询外键的内容

in 数据库

当有一个表同时有多个外键同时指向某一个表时,需要通过外键来查询到相应的信息。
举个例子:这是一个订车票的
城市表

CityID CityName
1 广州
2 湛江
3 江门
4 肇庆
5 惠州
6 汕头

车次表

CarID CarName StartCityID EndCityID
1 G001 1 2
2 G002 1 3

这里的StartCityID和EndCityID分别是城市表的外键
解决方法
现在要把对应的始发城市和终点城市的名称取到,mssql语句可以这样
方法一:

SELECT 始发站=c1.CityName,终点站=c2.CityName
FROM car,City c1,City c2
WHERE StartCityID = c1.CityID AND EndCityID = c2.CityID

方法二:

SELECT 始发站=c1.CityName,终点站=c2.CityName
FROM car
JOIN City c1 ON StartCityID = c1.CityID
JOIN City c2 ON EndCityID = c2.CityID

0 Comments

MSSQL触发器基础(在触发器遍历所有数据)

in 数据库

最近很懒,也有忙的原因~~一些东西懒得发上来了·~~还是要写上来才可以,不然学到的东西以后我就忘记了
以下只保证在MSSQL下顺利执行~~可能在MySql不太一样。
最近在做作业的时候想用用数据库的触发器写写~发觉还不是一般的烦呀~~变量多了就觉得有点烦了~~不过语言还是挺容易上手的~~
插播一句:ID自增的写法

CREATE TABLE ritem(
id int IDENTITY(1,1)
);

触发器的基本写法

CREATE TRIGGER 触发器名 ON 数据表名 FOR (INSERT|update|delete)
AS
begin
在这里写代码
end

定义变量,并赋值

CREATE TRIGGER t_insert_ritem ON ritem FOR INSERT
AS
begin
declare @id int
SELECT @id=id FROM inserted
– 从插入的数据获得ID的值,还有一个deleted
– inserted表示新的数据,deleted表示旧的数据(自己理解的,不知道对不对?)
 
SET @id = @id – 1
– 另一种赋值
 
PRINT @id
– 可以把值打印出来,在查询分析器结果可以看到
raiserror(’抛出错误 id的值为:%d’,16,1,@id)
– 也可以这样输出
 
IF (@id<0) begin
rollback transaction
– 回滚事务
end
 
IF EXISTS(SELECT * FROM ritem WHERE id=@id) begin
– 还可以用exists来判断是否为空
end
end
 
CREATE TRIGGER TRIGGER_Update ON ritem
FOR UPDATE
AS
[...]

2 Comments

MSSQL存储过程的用法:基础

in 数据库

创建存储过程的基本格式:

CREATE procedure update_createtime
@tbID int
AS
UPDATE t_member SET createTime = GetDate() WHERE tbID = @tbID
go

添加返回值时就可以这样做

–Developer:zhihui Zhou
–Date:New()as 2008-10-18
–Email:zhou5791759@163.com
–QQ:297510342
 
CREATE procedure update_createtime
@tbID int,
@createTime nvarchar(50) output
AS
UPDATE t_member SET createTime = GetDate() WHERE tbID = @tbID
SET @createTime = (SELECT createTime FROM t_member WHERE tbID = @tbID)
go

执行这个存储过程:

–Call SQL in the method [...]

2 Comments