+-------+------------+-----+-------+------+---------+
| id | picture_id | red | green | blue | percent |
+-------+------------+-----+-------+------+---------+
| 25495 | 5232689 | 80 | 76 | 73 | 57 |
| 25497 | 5232689 | 151 | 146 | 140 | 44 |
| 25421 | 5232695 | 160 | 109 | 65 | 46 |
| 25423 | 5232695 | 225 | 195 | 152 | 55 |
| 25371 | 5232723 | 22 | 19 | 24 | 63 |
| 25377 | 5232723 | 35 | 32 | 37 | 29 |
| 25375 | 5232723 | 87 | 75 | 79 | 7 |
| 25373 | 5232723 | 186 | 109 | 114 | 3 |
| 25323 | 5232729 | 17 | 16 | 19 | 12 |
| 25321 | 5232729 | 28 | 26 | 29 | 60 |
| 25313 | 5232729 | 40 | 37 | 41 | 13 |
| 25319 | 5232729 | 89 | 85 | 88 | 3 |
| 25317 | 5232729 | 146 | 142 | 142 | 2 |
| 25315 | 5232729 | 236 | 230 | 220 | 12 |
| 25257 | 5232731 | 15 | 13 | 18 | 26 |
| 25271 | 5232731 | 23 | 20 | 25 | 46 |
| 25265 | 5232731 | 34 | 30 | 35 | 20 |
| 25273 | 5232731 | 62 | 55 | 59 | 3 |
| 25269 | 5232731 | 99 | 176 | 138 | 2 |
| 25267 | 5232731 | 102 | 98 | 101 | 2 |
+-------+------------+-----+-------+------+---------+
数据结构如上,存储的是相关图片颜色的比值,如何去构建颜色筛选的语句,就好比 颜色=( 10,23,40 )比值=40%同时颜色=( 110 , 120 , 130 )比值=60%的语句?求教了
1
lichao 2015-09-02 17:42:15 +08:00
补基础知识啊
..... where ( ( red = 10 and green = 23 and blue = 40 and percent = 40 ) or ( red = 110 and green = 120 and blue = 130 and percent = 60 ) ) |
2
wuhang89 OP @lichao
你这个不对,因为一张图片是包含多个颜色的,我如果筛选的话肯定是要同时满足两个条件的,而你的语句只是满足一个条件的查询,不过还是很感谢你。 |
4
qiayue 2015-09-02 18:07:00 +08:00
那就把一楼的 or 改成 and
|
5
bestsanmao 2015-09-02 18:07:45 +08:00
@lichao
楼主的意思应该是这样 它一个图片可能由几个记录进行描述( picture_id 相同表示代表同一个图片) 每条记录的意思是 这个颜色值的点在像素总数中的百分比 想要构建的查询是 比如 红色像素占 20%同时绿色像素点 10%的图片 ID 都有哪些 |
6
luban 2015-09-02 18:07:51 +08:00
|
7
qiayue 2015-09-02 18:08:43 +08:00
终于明白了,比如你的图片 ID 是 5232723 在表里记录了好几个颜色
你要找的是符合多个颜色的同一个图片 ID |
8
skydiver 2015-09-02 18:09:12 +08:00
select A.picture_id from table A join table B on B.picture_id = A.picture_id where (
( A.red = 10 and A.green = 23 and A.blue = 40 and A.percent = 40 ) and ( B.red = 110 and B.green = 120 and B.blue = 130 and B.percent = 60 ) ) |
9
skydiver 2015-09-02 18:09:44 +08:00
table 是表名字。
|
10
qiayue 2015-09-02 18:10:33 +08:00
如果不用表连接的话,也可以按照一楼的方案先把数据查询出来,然后用程序来做处理
|
11
darluc 2015-09-03 00:09:01 +08:00
如果没有重复数据的话,
把一楼的改改就好了 select count (*) as cnt ..... where ( ( red = 10 and green = 23 and blue = 40 and percent = 40 ) or ( red = 110 and green = 120 and blue = 130 and percent = 60 ) ) group by picture_id having cnt = 2; |
12
wuhang89 OP 我想了下,目前这种数据结构 mysql 是查不出来的,你可以查两个颜色,那么多个颜色查询呢?我现在尝试用 elasticsearch 进行查询。
|
13
realpg 2015-09-03 17:06:20 +08:00 1
@wuhang89 没啥查不出来的。只是性能很差很难优化。
我把你的模型再抽象一下,因为你这还有 rgbp 四个参数,我直接精简成一个 color 方便测试和演示 注意, V2EX 有防注入和防跨站会把括号什么的加一些空格 导致语法问题,如果要自己测试请自行修复 SQL 语句 表结构和基础数据: CREATE TABLE IF NOT EXISTS `test_color` ( `id` int (10 ) unsigned NOT NULL AUTO_INCREMENT, `picid` int (10 ) unsigned NOT NULL, `color` int (10 ) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `test_color` (`id`, `picid`, `color`) VALUES (1, 1, 3 ), (2, 1, 5 ), (3, 2, 4 ), (4, 2, 6 ), (5, 2, 3 ), (6, 3, 5 ), (7, 3, 7 ), (8, 4, 7 ), (9, 4, 3 ), (10, 4, 5 ), (11, 4, 2 ); 建立的需求模型即是要找出同时有 color:3 和 color:5 的 picid ,需求基本跟楼主原来的模型一致吧?楼主的只是需要同时找出 r g b p 四个参数,需要多写一堆 and , select 后面变量要多列一堆 select distinct picid from (select a.id as aid,a.color as acolor,a.picid as picid,b.id as bid,b.color as bcolor from test_color a join test_color b on a.picid=b.picid where a.id<>b.id ) c where acolor=5 and bcolor=3 收工 |