百独托管7500 紫田网络超高转化播放器收cps[推荐]速盾CDN 免实名免备防屏蔽阿里云 爆款特卖9.9元封顶提升alexa、IP流量7Q5团队
【腾讯云】中小企福利专场【腾讯云】多款产品1折起高防 随时退换 好耶数据小飞国外网赚带你月入万元炎黄网络4H4G10M 99每月
香港带宽CN2/美国站群优惠中客数据中心 服务器租用联盟系统移动广告平台 中易企业专场腾讯云服务器2.5折九九数据 工信部正规资质
腾讯云新用户大礼包代金券高价收cpa注册量高价展示【腾讯云】2核2G/9.93起租服务器找45互联 随时退换阿里云 短信服务 验证秒达

[技术交流] 一个SQL查询排序的问题,大神指教下 [复制链接]
查看:2095 | 回复:19

215

主题

3924

帖子

5533

积分

落伍者(三羊开泰)

Rank: 3Rank: 3

贡献
458
鲜花
47
注册时间
2007-3-29

QQ绑定落伍手机绑定

发表于 2018-8-24 15:29:14 | |阅读模式 来自 中国浙江杭州
一个表,
id     姓名       年纪       性别
1       A             16           男
2       B             12           男
3       C             14           女
4       D             16           男
5       E             21           男
6       F             18           女



然后现在要根据2个条件搜索,
1:男的
2: 大于等于15岁以上
都搜出来。
但是排序的时候,同时满足2个条件的排前面,只满足一个条件的排后面

SQL语句应该怎么写呢?
没站 ,签啥名
落伍网友
落伍网友  发表于 2018-8-26 01:25:46 来自 中国广东广州
本帖最后由 匿名 于 2018-8-26 01:33 编辑

为什么这么一个问题没有人回答呢。。。。
可怕。。。匿

```
select *,IF(age>=15,1,0)+IF(sex='男',1,0)+IF(age>=15 AND sex='男',1,0) od
from od where sex='男' OR age>=15 order by od desc;
```

  1. +----+------+-----+-----+----+
  2. | id | name | age | sex | od |
  3. +----+------+-----+-----+----+
  4. |  1 | A    |  15 | 男  |  3 |
  5. |  4 | D    |  16 | 男  |  3 |
  6. |  5 | E    |  21 | 男  |  3 |
  7. |  2 | B    |  12 | 男  |  1 |
  8. |  6 | F    |  18 | 女  |  1 |
  9. +----+------+-----+-----+----+
复制代码

109

主题

8372

帖子

9766

积分

落伍者(三羊开泰)

阿Q

Rank: 3Rank: 3

贡献
2694
鲜花
31
注册时间
2005-1-22

落伍手机绑定

发表于 2018-8-24 15:37:42 | 来自 中国山东烟台
查询两次,然后拼接在一起
第一次 and
第二次 or

select * from table where 性别 = '男' and 年纪 >= 15 order by id desc

select * from table where (性别 = '男' or 年纪 >= 15)  and  id not in(select id from table where 性别 = '男' and 年纪 >= 15)  order by id desc
30元起 专业解决所有discuz各种疑难杂症

793

主题

8831

帖子

1万

积分

落伍者(四季发财)

光光

Rank: 4

贡献
2101
鲜花
36
注册时间
2005-4-11

落伍者落伍手机绑定

发表于 2018-8-24 15:38:13 | 来自 中国海南五指山
你的逻辑是不是有问题啊
你明明就列出两个条件了搜索了
那么搜索结果必然是满足两个条件的,怎么可能排序的时候有只满足一个条件的呢?
结果当中必然没有只满足一个条件的数据,除非你把两个结果集合并起来

793

主题

8831

帖子

1万

积分

落伍者(四季发财)

光光

Rank: 4

贡献
2101
鲜花
36
注册时间
2005-4-11

落伍者落伍手机绑定

发表于 2018-8-24 15:40:04 | 来自 中国海南五指山
select * from 你的表 where 性别=男 and 年纪>15
union
select * from 你的表 where 年纪<=15

215

主题

3924

帖子

5533

积分

落伍者(三羊开泰)

Rank: 3Rank: 3

贡献
458
鲜花
47
注册时间
2007-3-29

QQ绑定落伍手机绑定

 楼主| 发表于 2018-8-24 15:57:19 | 来自 中国浙江杭州
nanjim 发表于 2018-8-24 15:38
你的逻辑是不是有问题啊
你明明就列出两个条件了搜索了
那么搜索结果必然是满足两个条件的,怎么可能排序 ...

不是的,很多场合虽然给出2个搜索条件,却是“或”的关系,而甲方对结果显示有特别要求,满足全部条件的要优先显示。
没站 ,签啥名

215

主题

3924

帖子

5533

积分

落伍者(三羊开泰)

Rank: 3Rank: 3

贡献
458
鲜花
47
注册时间
2007-3-29

QQ绑定落伍手机绑定

 楼主| 发表于 2018-8-24 15:59:14 | 来自 中国浙江杭州
本帖最后由 卧草泥马 于 2018-8-24 16:01 编辑
smnh 发表于 2018-8-24 15:37
查询两次,然后拼接在一起
第一次 and
第二次 or


多谢。

我一开始是这样考虑的,搜索2次,第一次搜索全部满足的,并 记录下全部ID

然后再搜索满足单一条件的,并从中去除掉第一次的ID集合。

但是实际测试中,搜索效率非常低下……

而且这里只是2个搜索条件,实际使用中,搜索条件会达到3至5个
没站 ,签啥名

793

主题

8831

帖子

1万

积分

落伍者(四季发财)

光光

Rank: 4

贡献
2101
鲜花
36
注册时间
2005-4-11

落伍者落伍手机绑定

发表于 2018-8-24 16:08:51 | 来自 中国海南五指山
卧草泥马 发表于 2018-8-24 15:57
不是的,很多场合虽然给出2个搜索条件,却是“或”的关系,而甲方对结果显示有特别要求,满足全部条件的 ...

那就是你表达的有问题了,表达不准确

393

主题

2万

帖子

2万

积分

落伍热心会员

Rank: 7Rank: 7Rank: 7

贡献
1139
鲜花
543
注册时间
2001-10-4

落伍ASP落伍爱心勋章落伍草根英雄落伍手机绑定

发表于 2018-8-24 16:24:59 | 来自 中国河南洛阳
这有点像搜索引擎,搜索多个关键词的时候,同时包含多个关键词的排在前面,包含的少的排后边。
也许我没拿到满分,还不算是完美的人。所以我比谁都认真,努力赶上你的标准。

26

主题

809

帖子

1133

积分

落伍者(两全齐美)

Rank: 2

贡献
835
鲜花
1
注册时间
2005-12-24

落伍手机绑定

发表于 2018-8-24 16:26:01 | 来自 中国福建泉州
用存储过程
建个临时表把查询的记录填充到临时表中筛选
具体语句比较多我也懒得写了

850

主题

1万

帖子

5884

积分

落伍者(三羊开泰)

Rank: 3Rank: 3

贡献
711
鲜花
17
注册时间
2010-11-25

落伍手机绑定

发表于 2018-8-24 16:46:23 | 来自 中国广东深圳
大数据分析啊
Nothing
论坛客服/商务合作/投诉举报:2171544 (QQ)
落伍者创建于2001/03/14,本站内容均为会员发表,并不代表落伍立场!
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!
落伍官方微信:2030286 邮箱:(djfsys@gmail.com|tech@im286.com)
© 2001-2014

浙公网安备 33060302000191号

浙ICP备11034705号 BBS专项电子公告通信管[2010]226号

  落伍法律顾问: ITlaw-庄毅雄

手机版|找回帐号|不能发帖?|Archiver|落伍者

GMT+8, 2024-4-27 00:46 , Processed in 0.121415 second(s), 34 queries , Gzip On.

返回顶部