请教一句SQL

codeyell-com 2011-04-29 11:04:58
两个表,一个商家表,存储这个商家的供货信息,mid商家ID,gid商品的ID
mid gid
1 2
1 3
2 3

上面的数据表示商家ID是1的可以提供商品2 和商品3,商家2可以提供商品3

另一个订单表,存储订单里的商品。

问题:
现在已知一个订单ID,查订单表, 得到订单里几个商品的ID。,如何得到能提供所有这些商品的商家?比如订单里买了商品2和3,查询结果为商家1可以提供。

这个SQL要怎么写?

谢谢
...全文
160 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
kaifadi 2011-05-04
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 long0124 的回复:]

不喜欢写SQL,因为不会写!呵呵……
但是如果写SQL我的做法是拆分!先拆成多个语句实现自己的想法,然后再整合一下。
[/Quote]
呵呵,赞同啊。写那么复杂,大数据量下,对数据库执行效率都有影响!尤其是这种关联查询,即使用EXPLAIN去优化也未必能起到提高性能的作用,总有一个优化极限。我觉得还不如单一简单的查询,然后在PHP里组合查询结果字符!效率也许会更强悍!
long0124 2011-05-04
  • 打赏
  • 举报
回复
不喜欢写SQL,因为不会写!呵呵……
但是如果写SQL我的做法是拆分!先拆成多个语句实现自己的想法,然后再整合一下。
yuhq_towin 2011-05-04
  • 打赏
  • 举报
回复
select 商家表.mid , 商家表.gid from 商家表,订单表 where 商家表.gid = 订单表.gid
helloyou0 2011-04-30
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 helloyou0 的回复:]

版本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

这个需要解释一下,
这个并不完全返回包含所有的能提供所有产品的商户,
而是
如果 存在能提供所有产品……
[/Quote]

你也可以把 limit 1 去了, 然后用其他逻辑做取舍
helloyou0 2011-04-30
  • 打赏
  • 举报
回复
版本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

这个需要解释一下,
这个并不完全返回包含所有的能提供所有产品的商户,
而是
如果 存在能提供所有产品的商户, 那么 返回其中一个 (返回哪一个不定, 如果你的表中有更多字段,可以根据需要排序)
如果 不存在能提供所有产品的商户, 那么 返回能提供最多商品的商户中的一个

所以,虽然这个不是完全和你说的意思一样,但是也许更有用

codeyell-com 2011-04-29
  • 打赏
  • 举报
回复
建表语句:

-- 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.7

SET 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

执行上面的SQL

select mid from merchant where gid in (select gid from gorder where oid=1)

返回结果完全不对。
bjwangzhou 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hzhsky1985 的回复:]
select mid from 商家表 where gid in (select gid from 订单表)
[/Quote]

楼主尝试后望贴出或告知查询结果及查询速度的差异,我也学习一下
hzhsky1985 2011-04-29
  • 打赏
  • 举报
回复
select mid from 商家表 where gid in (select gid from 订单表)
helloyou0 2011-04-29
  • 打赏
  • 举报
回复
版本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)
bjwangzhou 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 baiyuxiong 的回复:]
不是这个意思

每个订单有多个商品的
每个商家也提供多个商品

我是想找,哪个商家可以提供这个订单里的所有商品


引用 1 楼 xuzuning 的回复:

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

select mid from 订单表,商家表 where 订单表.gid = 商家表.gid;
选取所有商家,条件满足商家提供的商品ID符合订单表中需要的商品ID
codeyell-com 2011-04-29
  • 打赏
  • 举报
回复
不是这个意思

每个订单有多个商品的
每个商家也提供多个商品

我是想找,哪个商家可以提供这个订单里的所有商品

[Quote=引用 1 楼 xuzuning 的回复:]

select * from 订单表, 商家表 where 订单表.gid=商家表.gid and 订单表.id=订单ID
[/Quote]
bjwangzhou 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 baiyuxiong 的回复:]
两个表,一个商家表,存储这个商家的供货信息,mid商家ID,gid商品的ID
mid gid
1 2
1 3
2 3

上面的数据表示商家ID是1的可以提供商品2 和商品3,商家2可以提供商品3

另一个订单表,存储订单里的商品。

问题:
现在已知一个订单ID,查订单表, 得到订单里几个商品的ID。,如何得到能提供所有这些商品的商家?比如订单里买了商品2和3,查询结果为商家……
[/Quote]

select mid from 订单表,商家表 where 订单表.gid='订单ID' and 订单表.gid = 商家表.gid;
xuzuning 2011-04-29
  • 打赏
  • 举报
回复
select * from 订单表, 商家表 where 订单表.gid=商家表.gid and 订单表.id=订单ID
xuzuning 2011-04-29
  • 打赏
  • 举报
回复
好像挺复杂的
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
foolbirdflyfirst 2011-04-29
  • 打赏
  • 举报
回复
mysql哪有array这种数据类型,都是串比较.
你再查查mysql函数看有没有什么新发现.
写个存储过程也是可以的.
codeyell-com 2011-04-29
  • 打赏
  • 举报
回复
sql里有个 x in array的用法

有没有 array in array的用法?


[Quote=引用 11 楼 foolbirdflyfirst 的回复:]

引用 7 楼 baiyuxiong 的回复:

建表语句:
SQL code

-- phpMyAdmin SQL Dump
-- version 3.3.2deb1
-- http://www.phpmyadmin.net
--
-- 主机: localhost
-- 生成日期: 2011 年 04 月 29 日 12:22
-- 服务器版本: 5.1.41
-- PH……
[/Quote]
foolbirdflyfirst 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 baiyuxiong 的回复:]

建表语句:
SQL code

-- 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.7

SET SQL_MO……
[/Quote]

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去处理吧
wdar1314 2011-04-29
  • 打赏
  • 举报
回复
原来你的意思是

同时提供 ...稍等
codeyell-com 2011-04-29
  • 打赏
  • 举报
回复
商家3只能提供产品2,
不能提供产品1

而订单1需要有产品一和产品二。

[Quote=引用 8 楼 wdar1314 的回复:]

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

没有错的~!
[/Quote]
wdar1314 2011-04-29
  • 打赏
  • 举报
回复
如果OID=1,就是订单为1
那么商品为1和2
能提供商品为1和2的
商家是 2和3

没有错的~!

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧