SELECT *
  FROM info t
 WHERE (SELECT COUNT(h.id)
          FROM hobby h
         WHERE t.id = h.info_id
           AND (h.hobby = '篮球' OR h.hobby = '足球')) = 2
--当然此处存在一个求和,所以爱好个数(2)也是一个参数。

解决方案 »

  1.   


    SELECT id,name
      FROM (SELECT t.id, t.name, wm_concat(h.hobby) hobbys
              FROM info t
              LEFT JOIN hobby h
                ON t.id = h.info_id
             GROUP BY t.id, t.name)
     WHERE instr(hobbys, '篮球') > 0
       AND instr(hobbys, '足球') > 0--或者这个也可以,info信息表 hobby爱好表
      

  2.   

    select * from 信息表
    where id in (select id from 爱好表
                where hobby in ('篮球','足球')
                group by id
                having count(distinct hobby)=2)
      

  3.   

     谢谢,已验证成功查询出来。
    不过现在令一个问题,如果我加一个条件该有如果现实:
    BI(BeginIndex,从某条的index开始获取,默认获取从最新的一条开始),
    PC(Count,获取多少条,默认10条)
    现在就是加入两个参数,一个BI,一个PC ,先要执行上面所说的,然后再执行BI和PC 两个参数的查询条件,那该怎么改?BI和PC 是可变的
      

  4.   

     哈哈、看着你的语句很眼熟的感觉,我之前也是根据从表返回ID 给主表的,只是我不知道怎么判断同时成立这个条件,我的是只要有一个成立都返回去了,现在看了你的有一钟茅塞顿开的感觉,受教了。现在的另一个问题假如另外一个查询条BI和PC 两个参数:
    BI(BeginIndex,从某条的index开始获取,默认获取从最新的一条开始),
    PC(Count,获取多少条,默认10条)
    现在就是加入两个参数,一个BI,一个PC ,先要执行上面所说的,然后再执行BI和PC 两个参数的查询条件,那该怎么改?
      

  5.   

    你的index是根据什么排序方式算出类的?
      

  6.   

    目前是通过id的排序方式,获取index,可以根据需要调整这里 row_number()over (order by id)
    select * from
    (select 信息表.*,row_number()over (order by id) as rn from 信息表
    where id in (select id from 爱好表
                where hobby in ('篮球','足球')
                group by id
                having count(distinct hobby)=2))
    where rn>=bi and rn<bi+pc
      

  7.   

    哎呀,大哥这语句出问题了!例如:我现在有一人物小明,爱好有 篮球,足球,羽毛球。如果我查询值输入篮球和足球,那么小明也给我查询出来啊!也就是说这是个模糊查询了啊。如果我值输入篮球,那么只要包含篮球的都给我查询出来了。还有 having count(distinct hobby)=2 这个2 我理解为爱好个数的,有多少个爱好就输入多少。如果有一个人物只有一个爱好 篮球,那么我 select * from 信息表
    where id in (select id from 爱好表
                where hobby in ('篮球')
                group by id
                having count(distinct hobby)=1) 那么有爱好篮球的都给查询出来了。。这个和我的需求不符合啊!
      

  8.   

    这个和你最开始表述的需求已经不一致了
    现在的需求,调整下语句就可以了
    select * from 信息表
    where id in (select id from 爱好表
                group by id
                having sum(decode(hobby,'篮球',0,'足球',0,1)=0
                and count(distinct hobby)=2)
      

  9.   

    having sum(decode(hobby,'篮球',0,'足球',0,1)=0
    --除了这两项之外没有其他的爱好
    and count(distinct hobby)=2
    --并且拥有两项爱好--综合这两个条件查询出来的就是只有这两个爱好的人
      

  10.   

    having sum(decode(hobby,'篮球',0,'足球',0,1))=0
    这句漏写了一个右括号,见谅
      

  11.   

    如果我值查询一个爱好的咋办?或者查询3个爱好的。是不是就是修改
     having sum(decode(hobby,'篮球',0,'足球',0,1)=0  这里面sum(decode(hobby,'篮球',0,'足球',0,1)=0的数? 其实我是不明白 decode(hobby,'篮球',0,‘足球’,0,1)  这里。这个篮球,0,足球0,1
     and count(distinct hobby)=2 这个等于 1 或者3 ?
    哈哈,那个括号的问题我可以解决的,这个没事。
      

  12.   

    如果我爱好表结构改了,里面加一个 字段。 
    那么我不但需要根据value的值还需要根据key 的值来判断。 是不是这个样子             select * from 信息表
    where id in (select id from 爱好表
                group by id
                having sum(decode(key,'L',0,'Z',0,1))=0
                and sum(decode(value,'篮球',0,'足球',0,1))=0
                and count(distinct key)=2) and count(distinct value)=2)
      

  13.   

    decode(hobby,'篮球',0,1)
    decode(hobby,'篮球',0,'足球',0,1)
    decode(hobby,'篮球',0,'篮球',0,'游泳',0,1)多一个就并在里面就可以了,没啥区别
      

  14.   

    key和value这两个,2选1就行了,没必要两个都有
      

  15.   

    key和value这两个,2选1就行了,没必要两个都有
    这个在我的需求中是要的,因为我的表中key对应多个value,在上面那个表中,key 的L 对应篮球,但是也可能不是篮球。这个懂了吧。key 对应的value值是不确定的。所以那个key和value 都要判断的。你看看我上面写的对不对!
      

  16.   

    可能存在问题
    假设L既对应篮球也对应足球
    那么既喜欢篮球也喜欢足球的人,取出的count(distinct key)取值为1,这样结果就不对了
    需要具体问题具体分析了
      

  17.   

    你这个假设L既对应篮球也对应足球 这个在同一个ID 上是不存在的,即是我id 为1 的人物张三,L 对应篮球,Z 对应的是足球,ID 为2 的李四,L 对应的是足球。Z 对应的是篮球。如果按照上面那个只需要判断一个就可以,那么我输入篮球和足球得到的应该是张三和李四。如果在加一个条件那么久不同了,我输入查询条件篮球和足球的同时也规定了L 对应的是篮球,Z 对应的是足球。那么应该只给我返回张三的信息,李四已经不符合查询要求了。(因为L 对应的是足球,Z 对应的是篮球)。