我想实现这样的方法,以菜单为例子 :A组数据(菜单):
菜单id 菜单名
1 鱼香肉丝
2 地三鲜
3 皮蛋瘦肉粥B组数据(材料需求)
主键id 菜单id 材料 需求数量
1 1 鱼 1
2 1 肉 1
3 1 油 1
4 1 盐 1
5 2 土豆 3
6 2 茄子 2
7 2 青椒 5
8 2 油 1
9 2 盐 1
10 3 皮蛋 2
11 3 肉 1
12 3 大米 1C组数据(拥有物品)
物品名 拥有数量
油 1
盐 1
皮蛋 3
肉 1
大米 10在查找A中所有的菜单名时,我希望显示的数序是这样的:A中菜单需要的材料与背包中已经有的材料种类和数量进行匹配,最相近的显示在最前面。
比如上面的例子显示的数序就是:
皮蛋瘦肉粥
鱼香肉丝
地三鲜(鱼香肉丝与地三鲜匹配的结果一样,可以随便排)
菜单id 菜单名
1 鱼香肉丝
2 地三鲜
3 皮蛋瘦肉粥B组数据(材料需求)
主键id 菜单id 材料 需求数量
1 1 鱼 1
2 1 肉 1
3 1 油 1
4 1 盐 1
5 2 土豆 3
6 2 茄子 2
7 2 青椒 5
8 2 油 1
9 2 盐 1
10 3 皮蛋 2
11 3 肉 1
12 3 大米 1C组数据(拥有物品)
物品名 拥有数量
油 1
盐 1
皮蛋 3
肉 1
大米 10在查找A中所有的菜单名时,我希望显示的数序是这样的:A中菜单需要的材料与背包中已经有的材料种类和数量进行匹配,最相近的显示在最前面。
比如上面的例子显示的数序就是:
皮蛋瘦肉粥
鱼香肉丝
地三鲜(鱼香肉丝与地三鲜匹配的结果一样,可以随便排)
SELECT * FROM A t1
ORDER BY
(SELECT COUNT(*) FROM B,C WHERE B.材料=C.物品名 AND B.菜单id=t1.菜单id
AND B.需求数量<=C.拥有数量) DESC;
+----+------------+
| id | name |
+----+------------+
| 1 | 鱼香肉丝 |
| 2 | 地三鲜 |
| 3 | 皮蛋瘦肉粥 |
+----+------------+
3 rows in set (0.02 sec)mysql> select * from game_b;
+----+-----+------+-----+
| id | aid | name | qty |
+----+-----+------+-----+
| 1 | 1 | 鱼 | 1 |
| 2 | 1 | 肉 | 1 |
| 3 | 1 | 油 | 1 |
| 4 | 1 | 盐 | 1 |
| 5 | 2 | 土豆 | 3 |
| 6 | 2 | 茄子 | 2 |
| 7 | 2 | 青椒 | 5 |
| 8 | 2 | 油 | 1 |
| 9 | 2 | 盐 | 1 |
| 10 | 3 | 皮蛋 | 2 |
| 11 | 3 | 肉 | 1 |
| 12 | 3 | 大米 | 1 |
+----+-----+------+-----+
12 rows in set (0.00 sec)mysql> select * from game_c;
+------+-----+
| name | qty |
+------+-----+
| 油 | 1 |
| 盐 | 1 |
| 皮蛋 | 3 |
| 肉 | 1 |
| 大米 | 10 |
+------+-----+
5 rows in set (0.00 sec)mysql> select a.*,(select count(1) from game_b b where b.aid=a.id and b.name not
in(select name from game_c c where c.name=b.name and c.qty>=b.qty)) as notok fr
om game_a a order by notok;
+----+------------+-------+
| id | name | notok |
+----+------------+-------+
| 3 | 皮蛋瘦肉粥 | 0 |
| 1 | 鱼香肉丝 | 1 |
| 2 | 地三鲜 | 3 |
+----+------------+-------+
3 rows in set (0.00 sec)
notok 是指数量不满足的物品数,不能用满足数,因为有可能某个菜的材料不满足数比其他菜的全部材料种类都多。P.S.这是哪款游戏啊?