两个表,一个商家表,存储这个商家的供货信息,mid商家ID,gid商品的ID
mid gid
1 2
1 3
2 3上面的数据表示商家ID是1的可以提供商品2 和商品3,商家2可以提供商品3另一个订单表,存储订单里的商品。问题:
现在已知一个订单ID,查订单表, 得到订单里几个商品的ID。,如何得到能提供所有这些商品的商家?比如订单里买了商品2和3,查询结果为商家1可以提供。这个SQL要怎么写?谢谢
mid gid
1 2
1 3
2 3上面的数据表示商家ID是1的可以提供商品2 和商品3,商家2可以提供商品3另一个订单表,存储订单里的商品。问题:
现在已知一个订单ID,查订单表, 得到订单里几个商品的ID。,如何得到能提供所有这些商品的商家?比如订单里买了商品2和3,查询结果为商家1可以提供。这个SQL要怎么写?谢谢
select mid from 订单表,商家表 where 订单表.gid='订单ID' and 订单表.gid = 商家表.gid;
select mid from 订单表,商家表 where 订单表.gid = 商家表.gid;
选取所有商家,条件满足商家提供的商品ID符合订单表中需要的商品ID
-- 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)返回结果完全不对。
那么商品为1和2
能提供商品为1和2的
商家是 2和3没有错的~!
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去处理吧
你再查查mysql函数看有没有什么新发现.
写个存储过程也是可以的.
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
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)
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这个需要解释一下,
这个并不完全返回包含所有的能提供所有产品的商户,
而是
如果 存在能提供所有产品的商户, 那么 返回其中一个 (返回哪一个不定, 如果你的表中有更多字段,可以根据需要排序)
如果 不存在能提供所有产品的商户, 那么 返回能提供最多商品的商户中的一个 所以,虽然这个不是完全和你说的意思一样,但是也许更有用
你也可以把 limit 1 去了, 然后用其他逻辑做取舍
但是如果写SQL我的做法是拆分!先拆成多个语句实现自己的想法,然后再整合一下。