一张主表存人员基本信息,一张子表存人员类别(A、B、C、D、E五类),人员类别可多选,如张三类别包括A、C、E三类,李四C、E类。现在如果要按照类别查询,如含有 C、E的人员,怎么写SQL?必须用存储过程吗?
解决方案 »
- 用mysql在Spring Security中配置的问题,求牛人帮忙解答!!!
- 不安装mysql也可以使用数据库?
- mysql 怎么判断是否存在
- mysql数据库,varchar属性字段,为什么中文的横线无法插入呢?
- 服务器重启后实体BEAN写入数据后MYSQL中原数据被覆盖了事怎么回事啊
- group by 后,除了sum,还可以使用其他函数吗?
- 请教SQL语句的一个问题。纠结了,
- 请教各位一个 MYSQL 存储过程
- 报错1064(42000) 郁闷!!!
- 靠!中招了,EMS PgManager只能自动生成select语句,现在老板要我找个可以像access那样,支持拖放,不但可以是select,还可以生成insert,d
- 想问各位大大 MySQL 是怎么做高可用的?
- 各位大神请帮忙下载几个mysql安全漏洞补丁
--测试数据
if not object_id(N'Tempdb..#MainTab') is null
drop table #MainTab
Go
Create table #MainTab([Id] int,[Name] nvarchar(22))
Insert #MainTab
select 1,N'张三' union all
select 2,N'李四' union all
select 3,N'王五'
GO
if not object_id(N'Tempdb..#DetailTab') is null
drop table #DetailTab
Go
Create table #DetailTab([Id] int,[UserType] nvarchar(21))
Insert #DetailTab
select 1,N'A' union all
select 1,N'C' union all
select 1,N'E' union all
select 2,N'C' union all
select 2,N'E' union all
select 3,N'A' union all
select 3,N'B' union all
select 3,N'C'
Go
--测试数据结束
SELECT #MainTab.* FROM #MainTab JOIN (
SELECT Id ,
COUNT(*) AS usercount
FROM #DetailTab
WHERE UserType IN ( 'C', 'E' )
GROUP BY Id
HAVING COUNT(*) = 2) AS t
ON t.Id = #MainTab.Id
王五不符合条件,没有搜索出来:
参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
SELECT #MainTab.* FROM #MainTab JOIN (
SELECT Id ,
COUNT(*) AS usercount
FROM #DetailTab
WHERE 性别='男' --就在这里加条件即可
GROUP BY Id
HAVING COUNT(*) = 2) AS t
ON t.Id = #MainTab.Id
测试表如下:
DROP TABLE IF EXISTS user_basic;
CREATE TABLE user_basic (
id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
user_name VARCHAR(20) DEFAULT NULL,
user_sex VARCHAR(2) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;INSERT INTO user_basic(user_name,user_sex)
SELECT '崔健','男' UNION ALL
SELECT '邓超','男' UNION ALL
SELECT '刘涛','女' UNION ALL
SELECT '崔永元','男';DROP TABLE IF EXISTS user_category;
CREATE TABLE user_category(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
fatid INT UNSIGNED NOT NULL,
user_category VARCHAR(10),
PRIMARY KEY (id),
FOREIGN KEY (fatid) REFERENCES user_basic(id)
) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci;INSERT INTO user_category(fatid,user_category)
SELECT 1,'A' UNION ALL
SELECT 1,'C' UNION ALL
SELECT 1,'D' UNION ALL
SELECT 2,'B' UNION ALL
SELECT 2,'C' UNION ALL
SELECT 3,'C' UNION ALL
SELECT 3,'D' UNION ALL
SELECT 3,'E' UNION ALL
SELECT 4,'D';
需要根据姓名、性别、子表中的类别进行检索,每个条件可以单独查询,如按性别查询;也可以组合查询,如按性别+类别查询,其中类别可以单选(如C),也可以多选(如D、C,既同时包括C、D类别的人员)
select * from user_basic where user_sex = '男'
#按性别+类型查询
SELECT user_basic.* FROM user_basic JOIN (
SELECT fatid ,
COUNT(*) AS usercount
FROM user_category
WHERE user_category IN ( 'C', 'D' )
GROUP BY fatid
HAVING COUNT(*) = 2) AS t
ON t.fatid = user_basic.Id
where user_sex = '男'