一个sql语句查询的问题

2012-07-23 13:50:06 +08:00
 kingwkb
表a

aid bid

100 59
100 47
100 22
100 32
200 59
200 22
200 25
300 26
300 36

就这2个字段

要查询出bid=47和22的aid
3560 次点击
所在节点    MySQL
37 条回复
qdvictory
2012-07-23 13:51:29 +08:00
select aid from a where bid=47 or bid =22;
yokle
2012-07-23 13:51:38 +08:00
select aid from a WHERE bid in (47,22)
ichigo
2012-07-23 13:51:50 +08:00
in
yyai3
2012-07-23 13:52:24 +08:00
select aid from a where bid=47 or bid=22 order by aid
kingwkb
2012-07-23 13:53:59 +08:00
@qdvictory
@yokle
@ichigo 要同时满足bid=47和22的aid,不是or

比如说200满足bid=22,不能满足bid=47,所以200就不能被查询出来,只有aid=100的才满足
kingwkb
2012-07-23 13:55:43 +08:00
@yyai3 是同时满足47和22的aid,不能用or
yyai3
2012-07-23 13:59:03 +08:00
select b.aid from a b inner join a c where b.aid=c.aid and b.bid=47 and c.bid =22
qdvictory
2012-07-23 13:59:47 +08:00
select aid from a where bid=47 and aid in (select aid from a where bid = 22);
kingwkb
2012-07-23 14:03:40 +08:00
@yyai3
@qdvictory 同时满足bid的值数目不确定,可能很多个,有没有简单的?
yyai3
2012-07-23 14:14:08 +08:00
select aid,count(*) from a where bid in () group by aid having count(*)=n
yyai3
2012-07-23 14:18:30 +08:00
要改成count(distinct bid) 去重吧
qdvictory
2012-07-23 14:22:39 +08:00
select * from (select if(count(*) > num,aid,0) as cid from a where bid in (22,47,...) group by cid order by cid desc) as s where s.cid != 0;

这是咋设计的表啊。。。
alsotang
2012-07-23 14:26:00 +08:00
我的答案跟#7一样
select aid from a as a1 inner join a as a2 where a1.bid = 47 and a1.bid = 22 and a1.aid = a2.aid

@yyai3
qdvictory
2012-07-23 14:27:03 +08:00
@yyai3 这个好~学习了~
kingwkb
2012-07-23 14:31:32 +08:00
@qdvictory
@yyai3 这个一个tag功能,我本来以为用and可以,但是。。。

aid是数据id 有个数据表,bid是tagid,另外还有个tag表保存tag id, name等

这个是保存数据id和tag id的关系表,就2列,一个数据可以有多个tag,就有了这个问题

麻烦请问下,这类问题怎么设计表好?
qdvictory
2012-07-23 14:49:22 +08:00
@kingwkb 不就是一个多对多的关系?
我一般用orm很轻易就解决了- -
yyai3
2012-07-23 14:52:24 +08:00
@kingwkb 没有遇到过~ 但是我想我也会这样设计~~
yokle
2012-07-23 14:59:23 +08:00
回头一看 这么多人 回答了。 这氛围不错 +1
colincat
2012-07-23 15:08:33 +08:00
@kingwkb 这不就是子类和父类的关系吗?

tagkey tag_f_id tag_name
1 0 读书
2 1 科幻类
3 1 教育类
4 2 国内仙剑
5 0 电影

以上tag代表标签的主键 tag_f_id代表父节点ID 0代表是最高节点

然后 这就类似递归。不知道是不是你想要的
alsotang
2012-07-23 15:10:15 +08:00
@kingwkb 我觉得你这个问题应该是个比较经典的设计问题,可能你的这个方法已经算是比较常见的解决办法了吧。我对于SQL的接触比较少,但是在Rails中的话....has_many会自动处理好这些问题,建议楼主google一下,应该就会得到答案了。我提供提供关键字吧:“rails hasmany SQL 如何设计”,试试这个。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/43202

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX