我在做一个记录表,记录表里的记录用user字段来说明其归属用户,那么一个用户找到自己的记录就很简单:
(例如我的用户id是19)
select * from log where user=19;同时,我想让某个记录,用户可以设置共享给其他用户,这就很头疼了,在设计上我最后想出的办法,就是再建立一个share表,
然后把记录的共享的关系记录在share表。log记录表
id  user  share   剩下的字段略
--------------------  
1  2         0    ...
2  19        0    ...
3  3         7    ...
4  3         0    ...
5  19        0    ...
6  2         0    ...
(user字段建立索引)
share表
shareID  user 
-------------------------
7         2
7         19
...
...
(shareID+user字段建立索引)
现在我不知道如何构造这一条sql句子,理想中应该是
select * from log where user=19 && (share!=0&&(select * from share where shareID=share&&user=19));就是列出user=19,同时 share不等于0同时share表有共享记录存在的。另外,有没有更好更具有效率的方式来实现我所说的功能?

解决方案 »

  1.   

    试下这个是否满足你的要求:
    select * from log a where a.user=19 and  a.share>0 and exists (select 1 from share  b where b.user=a.user);其实,对你的需求也是很模糊的:
    某个记录可以共享给其它用户,你是针对log表的id列来说呢还是针对user列来说的呢?如果是user列的话,假如是user=2的话,那是否会出现user=2但只有id=1的对应记录的share>0而id=6的 对应记录的share=0的情况呢?
    还有,就是你说的某条记录可以共享给其它用户,是不是一条记录只可以共享个一个用户呢?还是可以共享给多个用户呢?所以,你得说清楚你的需求吧
      

  2.   

    log记录表 
    id  user  share
    --------------------  
    1  2        0 
    2  19       0
    3  3        1
    4  3        0 
    5  19       0 
    6  2        0  
    聚集索引 id
    索引 usershare表 
    id   logid    user 
    ------------------------- 
    1    3        2 
    2    3        19 聚集索引  user, logid
    索引 logid
    SELECT * FROM log WHERE user =  100000
    UNION 
    SELECT log.* FROM share, log 
    WHERE share.logid = log.id 
    AND log.share = 1 
    AND share.user =  100000log.share 表示这条记录是否允许分享。