我想实现这样的方法,以菜单为例子 :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中菜单需要的材料与背包中已经有的材料种类和数量进行匹配,最相近的显示在最前面。
比如上面的例子显示的数序就是:
皮蛋瘦肉粥
鱼香肉丝
地三鲜(鱼香肉丝与地三鲜匹配的结果一样,可以随便排)

解决方案 »

  1.   


    SELECT * FROM A t1
    ORDER BY 
    (SELECT COUNT(*) FROM B,C WHERE B.材料=C.物品名 AND B.菜单id=t1.菜单id 
      AND B.需求数量<=C.拥有数量) DESC;
      

  2.   

    mysql> select * from game_a;
    +----+------------+
    | 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.这是哪款游戏啊?