table A(分类表) id name 1 分类1 2 分类2 3 分类3 4 分类4 5 分类5 6 分类6table B(材质表) id name 1 材质1 2 材质2 3 材质3 4 材质4 5 材质5 6 材质6table C(颜色表) id name 1 颜色1 2 颜色2 3 颜色3 4 颜色4 5 颜色5 6 颜色6table D(产品表) id product_name 分类id 材质id 颜色id 1 产品1 1 2 1 2 产品2 1 1 1 3 产品3 2 2 4 4 产品4 3 5 6 5 产品5 3 4 2 6 产品6 1 2 5假如我要搜索 有(分类1 并且 材质2 并且 颜色1) 的产品,需要5条数据; 如果是select * from 产品表D where 分类id=1 and 材质id=2 and 颜色id=3 ; 就只能找到一条数据,就是产品1;但是现在不足5条数据;我就要继续查找; 变成 select * from 产品表D where 分类id=1 and 材质id=2 ; (比上一个条件减少了一个条件) 现在只能找到产品2和产品1两条数据;数据还是不足5条;还要继续搜索,如此类推;
可以试试left join,把过滤条件构造为一个表: select a.* from 产品表D a left join (select 1 as 分类id,2 as 材质id,3 as 颜色id) b on a.分类id=b.分类id and a.材质id=b.材质id and a.颜色id=b.颜色id
id name
1 分类1
2 分类2
3 分类3
4 分类4
5 分类5
6 分类6table B(材质表)
id name
1 材质1
2 材质2
3 材质3
4 材质4
5 材质5
6 材质6table C(颜色表)
id name
1 颜色1
2 颜色2
3 颜色3
4 颜色4
5 颜色5
6 颜色6table D(产品表)
id product_name 分类id 材质id 颜色id
1 产品1 1 2 1
2 产品2 1 1 1
3 产品3 2 2 4
4 产品4 3 5 6
5 产品5 3 4 2
6 产品6 1 2 5假如我要搜索 有(分类1 并且 材质2 并且 颜色1) 的产品,需要5条数据;
如果是select * from 产品表D where 分类id=1 and 材质id=2 and 颜色id=3 ;
就只能找到一条数据,就是产品1;但是现在不足5条数据;我就要继续查找;
变成 select * from 产品表D where 分类id=1 and 材质id=2 ; (比上一个条件减少了一个条件)
现在只能找到产品2和产品1两条数据;数据还是不足5条;还要继续搜索,如此类推;
select a.* from 产品表D a left join (select 1 as 分类id,2 as 材质id,3 as 颜色id) b
on a.分类id=b.分类id and a.材质id=b.材质id and a.颜色id=b.颜色id
你先不考虑用sql来实现,如果你自己写程序,你要如何实现。你这个要实现的功能里面是有一个分支判断的,如果结果集1数据少了,就查询结果集2,如果结果集2少了,就查询结果集3
我觉得你这种,可以考虑用存储过程来实现,最后返回一个结果,先执行sql1,然后根据结果的条数,判断是否要继续查sql2
from 产品表 p
where 分类id=1 or 材质id=2 or 颜色id=3
order by (分类id=1)+(材质id=2)+(颜色id=3) desc
limit 5