首页新闻找找看学习计划

sql大神,求一个sql问题

0
悬赏园豆:120 [已解决问题] 解决于 2016-06-27 10:16

mysql数据库中存在以下两张表,

主表table_a:

id, name_a

 

子表table_b

id, a_id, name_b   ,其中a_id外键指向table_a

 

问题:

查找table_a中的符合以下条件的记录:

其子表中存在 name_b=“张三” 并且 name_b=“李四” 两条记录。

什麼江湖的主页 什麼江湖 | 初学一级 | 园豆:3
提问于:2016-06-15 15:53
< >
分享
最佳答案
0

Select A.a_id from 

(Select distinct a_id from table_b where name_b = '张三' )A

inner join (Select distinct a_id from table_b where name_b =  '李四')B

on A.a_id=B.a_id

有了a_id这东西,其他都好办了。

收获园豆:80
爱编程的大叔 | 高人七级 |园豆:29788 | 2016-06-15 16:04

结果应该是正确的,不过张三 、李四这些条件是动态的,个数也是动态的,程序中怎么组装这个sql呢

什麼江湖 | 园豆:3 (初学一级) | 2016-06-15 16:30

@什麼江湖: 组装是另外一个问题吧,想想总能想出来的。

你自己想吧,SQL问题要完成一般都不难,只要思路清晰。(当然性能优化是另外一回事了)

我很少在程序中写SQL语句,LINQ好多年了。

爱编程的大叔 | 园豆:29788 (高人七级) | 2016-06-15 16:36
其他回答(8)
0

select id,name_a from table_a inner join table_b on table_a.id=table_b.a_id

where name_b = '张三' or name_b = '李四'

group by id,name_a

select id ,name_a from table_a where exists (select 1 from table_b where a_id = id and (name_b = '张三' or name_b = '李四'))

收获园豆:40
长蘑菇星人 | 园豆:1820 (小虾三级) | 2016-06-15 16:00

where name_b = '张三' and name_b = '李四'  这个肯定不对啊

支持(0) 反对(0) 什麼江湖 | 园豆:3 (初学一级) | 2016-06-15 16:25

@什麼江湖: 对对对。应该是or,栽了。

支持(0) 反对(0) 长蘑菇星人 | 园豆:1820 (小虾三级) | 2016-06-15 16:26

@长蘑菇星人: 哈哈哈,这个题是送命题。

支持(0) 反对(0) 长蘑菇星人 | 园豆:1820 (小虾三级) | 2016-06-15 16:34

@长蘑菇星人: 您这是写了两条sql是吗?如果子表中同时存在两条 张三 或两条 李四 的话,结果又不对了

支持(0) 反对(0) 什麼江湖 | 园豆:3 (初学一级) | 2016-06-15 16:35

@什麼江湖: 您说的对,我刚百度学习的sql

支持(0) 反对(0) 长蘑菇星人 | 园豆:1820 (小虾三级) | 2016-06-15 16:37

@什麼江湖: 

select id ,name_a from table_a where exists (select 1 from table_b where a_id = id and name_b = '张三' ) and exists (select 1 from table_b where a_id = id and name_b = '李4' )

支持(0) 反对(0) 长蘑菇星人 | 园豆:1820 (小虾三级) | 2016-06-15 16:59

@什麼江湖: 

select * from table_a where
(select count(name_b) from (select name_b from table_b where name_b in ('张三','李四') and a_id = table_a.id
group by name_b ) as c) = 2

支持(0) 反对(0) 长蘑菇星人 | 园豆:1820 (小虾三级) | 2016-06-15 17:08
0

SELECT * FROM table_a a WHERE (SELECT COUNT(id) FROM table_b b WHERE a.id = b.a_id and (b.name_b = '张三' or b.name_b = '李四') =2。

很没有效率的语句,应该能用。懒得去连表运算了。

幻天芒 | 园豆:36522 (高人七级) | 2016-06-15 16:00

这个有问题吧 ,如果一个主表下存在两个“张三”的话,不就出问题了吗

支持(0) 反对(0) 什麼江湖 | 园豆:3 (初学一级) | 2016-06-15 16:27

@什麼江湖: 如果是只要求存在,不限制数量,当然就得改改。一个子查询搞不定,那就两个。

支持(0) 反对(0) 幻天芒 | 园豆:36522 (高人七级) | 2016-06-16 08:01
0

select table_a.id,table_a.name_a,table_b.name_b from table_a ,table_b where table_b.a_id=table_a.id and (name_b='张三' or name_b='李四')

如此低调的男人 | 园豆:840 (小虾三级) | 2016-06-15 16:33

这个肯定不对的

支持(0) 反对(0) 什麼江湖 | 园豆:3 (初学一级) | 2016-06-15 16:41

@什麼江湖: 这个是sqlserver,mysql的写法不清楚

支持(0) 反对(0) 如此低调的男人 | 园豆:840 (小虾三级) | 2016-06-15 16:44
0

sql中还可以这样写:SELECT a.id,b.name_b FROM dbo.Table_a AS a,dbo.Table_b AS b
WHERE b.a_id=a.id  and b.name_b in('张三','李四')

Love简爱 | 园豆:206 (菜鸟二级) | 2016-06-15 17:18

都是不认真看题的啊。

支持(0) 反对(0) 爱编程的大叔 | 园豆:29788 (高人七级) | 2016-06-15 18:29
0

select * from table_a  where id  in  (select a_id from table_b b1 left join table_b b2 on b1.a_id = b2.a_id where b1.name='张三'  and  b2.name='李四')

虫子爱叮神 | 园豆:204 (菜鸟二级) | 2016-06-16 12:00
0

SELECT * FROM table_a FROM id IN(SELECT a_id FROM table_b WHERE name_b='张三' INTERSECT SELECT a_id FROM table_b WHERE name_b='李四')

我认真看题目了,啊哈,应该可以

谢_强 | 园豆:202 (菜鸟二级) | 2016-06-16 17:45

@什麼江湖  这是ms sqlservice 中的写法, 不知道在mysql中是否可行

支持(0) 反对(0) 谢_强 | 园豆:202 (菜鸟二级) | 2016-06-16 17:54
0

select * from  table_a where id in (select a_id from table_b where name_b="张三" or name_b="李四")

麦田清风 | 园豆:7 (初学一级) | 2016-06-17 16:48
0

SELECT id ,name_a FROM table_a
WHERE id IN (
SELECT a_id FROM table_b
WHERE name_b IN ('张三','李四')
)

Zachary_Fan | 园豆:762 (小虾三级) | 2016-06-18 17:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册