假设一新闻系统,有二表
表一:新闻表news(newsid)
表二:类别表class(classid)
表三:新闻类别关联表newsclass(newsid,classid)
一条新闻可同属多个分类。示例数据如下:
newsid  classid
1        1
1        2
1        3
2        2
2        3
3        4要查询classid等于2跟3的新闻id,得到如下记录集
newsid
1
2 sql语句怎么写?上面是简单例子,实际应用要求给出任意多个新闻分类组合,查询出相应的新闻id列表?      

解决方案 »

  1.   

    select newsid from news where classid in (2,3) group by newsid
      

  2.   

    DECLARE @t TABLE(newsid int,  classid int)
    INSERT @t 
    SELECT 1,1 UNION ALL SELECT
    1,2 UNION ALL SELECT
    1,3 UNION ALL SELECT
    2,2 UNION ALL SELECT
    2,3 UNION ALL SELECT
    3,4
    DECLARE @s VARCHAR(100)
    SET @s='2,3'
    SELECT * FROM @tSELECT DISTINCT a.NewsID FROM 
    (SELECT NewsID FROM @t GROUP BY newsID) a
    INNER JOIN @t b
    ON b.NewsID=a.NewsID AND CHARINDEX(','+RTRIM(b.ClassID)+',',',' + @s + ',')>0
      

  3.   

    上面语句有问BUG.修正一下.DECLARE @t TABLE(newsid int,  classid int)
    INSERT @t 
    SELECT 1,1 UNION ALL SELECT
    1,2 UNION ALL SELECT
    1,3 UNION ALL SELECT
    2,2 UNION ALL SELECT
    2,3 UNION ALL SELECT
    3,4 UNION ALL SELECT
    1,5DECLARE @s VARCHAR(100)
    SET @s='2,3'   --假设你要查的classid为2,3。
    SELECT * FROM @tSELECT  a.NewsID FROM 
    (SELECT NewsID FROM @t GROUP BY newsID) a
    INNER JOIN @t b
    ON b.NewsID=a.NewsID
     AND CHARINDEX(','+RTRIM(b.ClassID)+',',',' + @s + ',')>0
    GROUP BY a.NewsID HAVING COUNT(b.classid)= (LEN(REPLACE(@s,',',',,'))-LEN(@s)+1)