两个表,一个商家表,存储这个商家的供货信息,mid商家ID,gid商品的ID
mid gid
1 2
1 3
2 3上面的数据表示商家ID是1的可以提供商品2 和商品3,商家2可以提供商品3另一个订单表,存储订单里的商品。问题:
现在已知一个订单ID,查订单表, 得到订单里几个商品的ID。,如何得到能提供所有这些商品的商家?比如订单里买了商品2和3,查询结果为商家1可以提供。这个SQL要怎么写?谢谢

解决方案 »

  1.   

    select * from 订单表, 商家表 where 订单表.gid=商家表.gid and 订单表.id=订单ID
      

  2.   


    select mid from 订单表,商家表 where 订单表.gid='订单ID' and 订单表.gid = 商家表.gid;
      

  3.   


    select mid from 订单表,商家表 where 订单表.gid = 商家表.gid;
    选取所有商家,条件满足商家提供的商品ID符合订单表中需要的商品ID
      

  4.   

    select mid from 商家表 where gid in (select gid from 订单表)
      

  5.   

    建表语句:-- phpMyAdmin SQL Dump
    -- version 3.3.2deb1
    -- http://www.phpmyadmin.net
    --
    -- 主机: localhost
    -- 生成日期: 2011 年 04 月 29 日 12:22
    -- 服务器版本: 5.1.41
    -- PHP 版本: 5.3.2-1ubuntu4.7SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";--
    -- 数据库: `test`
    ---- ----------------------------------------------------------
    -- 表的结构 `gorder`
    --CREATE TABLE IF NOT EXISTS `gorder` (
      `oid` int(11) NOT NULL,
      `gid` int(11) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;--
    -- 转存表中的数据 `gorder`
    --INSERT INTO `gorder` (`oid`, `gid`) VALUES
    (1, 1),
    (1, 2),
    (2, 2);-- ----------------------------------------------------------
    -- 表的结构 `merchant`
    --CREATE TABLE IF NOT EXISTS `merchant` (
      `mid` int(11) NOT NULL,
      `gid` int(11) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;--
    -- 转存表中的数据 `merchant`
    --INSERT INTO `merchant` (`mid`, `gid`) VALUES
    (2, 1),
    (2, 2),
    (3, 2);如果OID=1话,结果应该是mid=2执行上面的SQLselect mid from merchant where gid in (select gid from gorder where oid=1)返回结果完全不对。
      

  6.   

    如果OID=1,就是订单为1
    那么商品为1和2
    能提供商品为1和2的
    商家是 2和3没有错的~!
      

  7.   


    SELECT s2.mid FROM (
     SELECT GROUP_CONCAT(gid) AS gid FROM gorder WHERE oid=1 ORDER BY gid
    ) s1
    ,(
       SELECT MID,GROUP_CONCAT(gid) AS gid FROM merchant GROUP BY MID ORDER BY gid
    ) s2
    WHERE LOCATE(s1.gid,s2.gid)建议还是都取出来php去处理吧
      

  8.   

    sql里有个 x in array的用法有没有 array in array的用法?
      

  9.   

    mysql哪有array这种数据类型,都是串比较.
    你再查查mysql函数看有没有什么新发现.
    写个存储过程也是可以的.
      

  10.   

    好像挺复杂的
    select *, group_concat(gid) as gg 
     from merchant a left join (
       select oid, group_concat(gid) as gids from gorder group by oid
       ) b on find_in_set(a.gid, b.gids)
     where oid=1 group by mid
     HAVING gids=gg
      

  11.   

    版本1:
      select m.mid
      from gorder g, merchant m
      where g.gid=m.gid and g.oid=1
      group by m.mid
      having count(*)=(select count(*) from gorder where oid=1)
      

  12.   

    版本2:
      select mid,count(*) c
      from gorder g, merchant m
      where g.gid=m.gid and g.oid=1
      group by m.mid
      order by c desc
      limit 1这个需要解释一下, 
    这个并不完全返回包含所有的能提供所有产品的商户,
    而是
      如果 存在能提供所有产品的商户, 那么 返回其中一个 (返回哪一个不定, 如果你的表中有更多字段,可以根据需要排序)
      如果 不存在能提供所有产品的商户, 那么 返回能提供最多商品的商户中的一个 所以,虽然这个不是完全和你说的意思一样,但是也许更有用 
      

  13.   


    你也可以把 limit 1 去了, 然后用其他逻辑做取舍
      

  14.   

     select 商家表.mid , 商家表.gid from 商家表,订单表 where 商家表.gid = 订单表.gid
      

  15.   

    不喜欢写SQL,因为不会写!呵呵……
    但是如果写SQL我的做法是拆分!先拆成多个语句实现自己的想法,然后再整合一下。
      

  16.   

     呵呵,赞同啊。写那么复杂,大数据量下,对数据库执行效率都有影响!尤其是这种关联查询,即使用EXPLAIN去优化也未必能起到提高性能的作用,总有一个优化极限。我觉得还不如单一简单的查询,然后在PHP里组合查询结果字符!效率也许会更强悍!