免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5635 | 回复: 8
打印 上一主题 下一主题

请教一个mysql查询交集问题(只涉及一张表) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-12 14:18 |只看该作者 |倒序浏览
现有表结构如下:分别是动物编号和动物属性两个字段

+------+------+
| id     | type |
+------+------+
|    1   | cat   |
|    1   | dog  |
|    1   | pig   |
|    0   | dog  |
|    2   | dog  |
|    3   | cat   |
|    3   | pig   |
+------+------+

问题1 现在就是想找出哪些动物,既是猫,也是狗还是猪? 比如在这个表里面就是1号动物才满足要求.

问题2 是否有更高明的表结构来设计此表?
因为鄙人的需求就是一个动物可能有多种属性,需要一张表来存储n个动物所具有的n种属性。然后方便解决掉问题1

先行谢过!

[ 本帖最后由 zagorot 于 2006-5-12 14:39 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-05-12 14:46 |只看该作者
原帖由 zagorot 于 2006-5-12 14:18 发表
哪些动物,既是猫,也是狗还是猪?

这个搞笑,哈哈

你的意思是找出“同时具有若干种 type 值的 id”?
那么,若干种 type 你准备怎么提供?
我下面是假设你要选择同时是猫和猪的,你就按自己要求在中间那行 where 子句的括号中修改(按你题目要求,只要 Y.id = 1 即可)。
select id, type from TBName X where not exists
  (select * from TBName Y where (Y.type = 'cat' or Y.type = 'pig') and not exists
    (select * from TBName Z where Z.id = X.id and Z.type = Y.type));

[ 本帖最后由 rardge 于 2006-5-12 14:47 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-05-12 14:52 |只看该作者
你的意思是找出“同时具有若干种 type 值的 id”?

对头。

那么,若干种 type 你准备怎么提供?

这个没什么关系。别人搜索的时候,输入“猪 狗”,那我这里就需要找出既是猪又是狗的动物编号。
如果输入“猪 狗 猫”,那就找出既是猪又是狗还是猫的动物


当然举例并不恰当,只是想描述更清晰些。不知道有没有适得其反?
你的sql执行结果是对的,我不知道还有没有更简洁的sql?

[ 本帖最后由 zagorot 于 2006-5-12 15:04 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-05-12 15:45 |只看该作者
原帖由 rardge 于 2006-5-12 14:46 发表

select id, type from TBName X where not exists
  (select * from TBName Y where (Y.type = 'cat' or Y.type = 'pig') and not exists
    (select * from TBName Z where Z.id = X.id and Z.type = Y.type));

   悍!

论坛徽章:
0
5 [报告]
发表于 2006-05-12 16:19 |只看该作者
Cat,Dog之类的,是固定了几种吗?还是一般的字符串?

建议用字符串来存储.

论坛徽章:
0
6 [报告]
发表于 2006-05-12 16:19 |只看该作者
还有人帮忙吗?

论坛徽章:
0
7 [报告]
发表于 2006-05-12 16:21 |只看该作者
原帖由 ipaddr 于 2006-5-12 16:19 发表
Cat,Dog之类的,是固定了几种吗?还是一般的字符串?

建议用字符串来存储.


没有固定。

在实际的应用中就是,用户可以对某个一个动物,输入任意的“type”去标识它,这个动物可能被某个用户标识为“猫科”,同时呢,也可能被用户标识成“胎生”等等等等,那我插入数据库就变成了
------
id    type
1     猫科
1     胎生
2     猫科
......
------
然后呢,用户会随意的输入关键字来联合查询他们的交集:比如“猫科 胎生”,这样我就要返回1号动物给用户,而不是2号。
动物type是随意不确定的。用户的查询关键字也是可以随意组合的。

[ 本帖最后由 zagorot 于 2006-5-12 16:32 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-05-15 11:34 |只看该作者
还有一个思路可以尝试一下,就是把属性字段设置为 text 类型,反正用户输入的东西也是任意的,不是由你指定的。
然后用 MySQL 的全文搜索函数功能去搜索,类似与网络上搜索引擎方式。
不过我上面提供那种方式返回的记录肯定和用户指定的值匹配,全文搜索的方式可能会有些相关的记录也搜索出来,这个我没怎么用过,你自己了解一下吧。

论坛徽章:
0
9 [报告]
发表于 2006-05-16 11:54 |只看该作者
为什么分成2个表?
一个表是属性,就是 Type
另一个就是所有那个怪胎表罗 ,因为我看,怪胎有且只有一个,至于这个怪胎是什么,就看它的 属性ID就可以了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP