c*******e 发帖数: 9475 | 1 嗯,对我这个外行复杂,对各位大牛可能是很简单的啦。
两个表
Table Categories
Id | Brand1 | Brand2 | Other Columns
1 | X | Y
2 | Z |
Table Products
Id | Brand | Other Columns
1 | X
2 | X
3 | X
4 | X
5 | Y
6 | Y
7 | Y
8 | Z
9 | Z
也就是说,每个产品类别有一到两个品牌,而每个品牌有很多个产品。
现在需要对根据其他条件选定的若干产品类别,挑出每个类别的每个
品牌要随机两个产品,提取一个产品列表。求搞定T-SQL,拜谢 |
s**********o 发帖数: 14359 | 2 每个类别和产品之间有什么关系?
类别怎么和品牌会有直接关系呢
比如我生产电脑,显然是类别和产品是直接联系的,类别如果联系品牌的,
DELL又出显示器又卖笔记本,显然成了多对多
类别:硬盘,显示器,笔记本
产品:SATA, IDE, SCSI, SSD, LCD,LED,IPS,INTEL 2DUO,AMD 5K
品牌:日历,希捷,西部数据,DELL,HP,VIEWSONIC |
c*******e 发帖数: 9475 | 3 对不起,开始没有说清楚。我这个例子举的不是太好。把它用车来说可能明白点。
Table Categories
Id |Category | Brand1 | Brand2 | Other Columns
1 |日车 | 本田 | 丰田
2 |美车 | 福特 | 通用
3 |德车 | 大众 |
4 。。。
Table Products
Id | Brand | Product | Other Columns
1 | 本田 | 刺猬壳
2 | 本田 | 阿阔的
3 | 本田 | 飞行员
4 | 本田 | 奥德赛
5 | 丰田 | 假美丽
6 | 丰田 | 烤肉啦
7 | 丰田 | 高地人
8 | 福特 | 金牛
9 | 福特 | 探索者
10 。。。
每种类别只有一或者两个品牌。现在需要找出所有日车和美车的代表车型,要求每个
品牌随机挑两个车型。希望我说明白了。。。
【在 s**********o 的大作中提到】 : 每个类别和产品之间有什么关系? : 类别怎么和品牌会有直接关系呢 : 比如我生产电脑,显然是类别和产品是直接联系的,类别如果联系品牌的, : DELL又出显示器又卖笔记本,显然成了多对多 : 类别:硬盘,显示器,笔记本 : 产品:SATA, IDE, SCSI, SSD, LCD,LED,IPS,INTEL 2DUO,AMD 5K : 品牌:日历,希捷,西部数据,DELL,HP,VIEWSONIC
|
s***s 发帖数: 1301 | 4 我觉得可以先用unpivot 把table categories变成
1 |日车 | 本田
2 |日车 | 丰田
3 |美车 | 福特
4 |美车 | 通用
...
然后 join table products
这样得到
1 |日车 | 本田 |刺猬壳
2 |日车 | 本田 |阿阔的
3 |美车 | 福特 |金牛
....
然后再按照车厂商 和品牌 名称,随机提取2个
这个就有很多方法了,
比如在每组厂商、品牌中,给车排个序,每次随机取2个
【在 c*******e 的大作中提到】 : 对不起,开始没有说清楚。我这个例子举的不是太好。把它用车来说可能明白点。 : Table Categories : Id |Category | Brand1 | Brand2 | Other Columns : 1 |日车 | 本田 | 丰田 : 2 |美车 | 福特 | 通用 : 3 |德车 | 大众 | : 4 。。。 : Table Products : Id | Brand | Product | Other Columns : 1 | 本田 | 刺猬壳
|
s**********o 发帖数: 14359 | 5 这不简单么,最后就是一个BRAND随机抽两个PRODUCT,
1个BRAND只能是一类,JOIN上CATEGORY不就行了
从这个TABLE随机抽BRAND吗,用ORDER BY NEWID()取TOP 2
id | Category| Brand | Product | Other Columns
1 | 日本| 本田 | 刺猬壳
2 | 日本| 本田 | 阿阔的
3 | 日本| 本田 | 飞行员
4 | 日本| 本田 | 奥德赛
5 | 日本| 丰田 | 假美丽
6 | 日本| 丰田 | 烤肉啦
7 | 日本| 丰田 | 高地人
8 | 美国| 福特 | 金牛
9 | 美国| 福特 | 探索者 |
c*******e 发帖数: 9475 | 6 恕我愚钝,我的目的不是随机抽取品牌,而是选定若干品牌,比如所有日车和美车的
品牌,然后每个品牌随机抽取两个车型。用order by newid()取top 2我只会取
总共两个。如果每个选定品牌都要随机抽取两个车型,比如4个品牌就要选8个车型,
怎么做呢,用group by和having吗,我不知道怎么写
【在 s**********o 的大作中提到】 : 这不简单么,最后就是一个BRAND随机抽两个PRODUCT, : 1个BRAND只能是一类,JOIN上CATEGORY不就行了 : 从这个TABLE随机抽BRAND吗,用ORDER BY NEWID()取TOP 2 : id | Category| Brand | Product | Other Columns : 1 | 日本| 本田 | 刺猬壳 : 2 | 日本| 本田 | 阿阔的 : 3 | 日本| 本田 | 飞行员 : 4 | 日本| 本田 | 奥德赛 : 5 | 日本| 丰田 | 假美丽 : 6 | 日本| 丰田 | 烤肉啦
|
c*******e 发帖数: 9475 | 7 请问怎么给车排个序,每次随机取2个,求别笑话我
【在 s***s 的大作中提到】 : 我觉得可以先用unpivot 把table categories变成 : 1 |日车 | 本田 : 2 |日车 | 丰田 : 3 |美车 | 福特 : 4 |美车 | 通用 : ... : 然后 join table products : 这样得到 : 1 |日车 | 本田 |刺猬壳 : 2 |日车 | 本田 |阿阔的
|
B*****g 发帖数: 34098 | 8 top2是随便取2个,而不是随机取2个
【在 c*******e 的大作中提到】 : 恕我愚钝,我的目的不是随机抽取品牌,而是选定若干品牌,比如所有日车和美车的 : 品牌,然后每个品牌随机抽取两个车型。用order by newid()取top 2我只会取 : 总共两个。如果每个选定品牌都要随机抽取两个车型,比如4个品牌就要选8个车型, : 怎么做呢,用group by和having吗,我不知道怎么写
|
B*****g 发帖数: 34098 | 9 90%以上的数据库版SQL问题可以用partition by解决
Oracle version:
WITH t AS (
SELECT c.category, p.brand, p.product, ROW_NUMBER() OVER (PARTITION BY c.
category, p.brand ORDER BY dbms_random.value) rn
FROM Categories c, Products p
WHERE (p.brand = c.brand1 OR p.brand = c.brand2))
SELECT category, brand, product
FROM t
WHERE rn <= 2
【在 c*******e 的大作中提到】 : 嗯,对我这个外行复杂,对各位大牛可能是很简单的啦。 : 两个表 : Table Categories : Id | Brand1 | Brand2 | Other Columns : 1 | X | Y : 2 | Z | : Table Products : Id | Brand | Other Columns : 1 | X : 2 | X
|
c*******e 发帖数: 9475 | 10 太谢谢了,赞美给出了翔实的答案,好人一生平安!包子奉上
【在 B*****g 的大作中提到】 : 90%以上的数据库版SQL问题可以用partition by解决 : Oracle version: : WITH t AS ( : SELECT c.category, p.brand, p.product, ROW_NUMBER() OVER (PARTITION BY c. : category, p.brand ORDER BY dbms_random.value) rn : FROM Categories c, Products p : WHERE (p.brand = c.brand1 OR p.brand = c.brand2)) : SELECT category, brand, product : FROM t : WHERE rn <= 2
|
|
|
B*****g 发帖数: 34098 | 11 号召大家向crysknife学习,问了问题要给包子
【在 c*******e 的大作中提到】 : 太谢谢了,赞美给出了翔实的答案,好人一生平安!包子奉上
|
c*******e 发帖数: 9475 | 12 嗯,对我这个外行复杂,对各位大牛可能是很简单的啦。
两个表
Table Categories
Id |Category | Brand1 | Brand2 | Other Columns
1 |日车 | 本田 | 丰田
2 |美车 | 福特 | 通用
3 |德车 | 大众 |
4 。。。
Table Products
Id | Brand | Product | Other Columns
1 | 本田 | 刺猬壳
2 | 本田 | 阿阔的
3 | 本田 | 飞行员
4 | 本田 | 奥德赛
5 | 丰田 | 假美丽
6 | 丰田 | 烤肉啦
7 | 丰田 | 高地人
8 | 福特 | 金牛
9 | 福特 | 探索者
10 。。。
每种类别只有一或者两个品牌。现在需要找出所有日车和美车的代表车型,要求每个
品牌随机挑两个车型。希望我说明白了。。。
----------------------
Update: 一年前在这里问,Beijing大牛指点用partition,很快搞定。当时用的软软
的SQL Server。现在这个要改成MySQL了,语法有差别我又不会了,求救,有包子! |
s**********o 发帖数: 14359 | 13 每个类别和产品之间有什么关系?
类别怎么和品牌会有直接关系呢
比如我生产电脑,显然是类别和产品是直接联系的,类别如果联系品牌的,
DELL又出显示器又卖笔记本,显然成了多对多
类别:硬盘,显示器,笔记本
产品:SATA, IDE, SCSI, SSD, LCD,LED,IPS,INTEL 2DUO,AMD 5K
品牌:日历,希捷,西部数据,DELL,HP,VIEWSONIC |
s***s 发帖数: 1301 | 14 我觉得可以先用unpivot 把table categories变成
1 |日车 | 本田
2 |日车 | 丰田
3 |美车 | 福特
4 |美车 | 通用
...
然后 join table products
这样得到
1 |日车 | 本田 |刺猬壳
2 |日车 | 本田 |阿阔的
3 |美车 | 福特 |金牛
....
然后再按照车厂商 和品牌 名称,随机提取2个
这个就有很多方法了,
比如在每组厂商、品牌中,给车排个序,每次随机取2个
【在 c*******e 的大作中提到】 : 对不起,开始没有说清楚。我这个例子举的不是太好。把它用车来说可能明白点。 : Table Categories : Id |Category | Brand1 | Brand2 | Other Columns : 1 |日车 | 本田 | 丰田 : 2 |美车 | 福特 | 通用 : 3 |德车 | 大众 | : 4 。。。 : Table Products : Id | Brand | Product | Other Columns : 1 | 本田 | 刺猬壳
|
s**********o 发帖数: 14359 | 15 这不简单么,最后就是一个BRAND随机抽两个PRODUCT,
1个BRAND只能是一类,JOIN上CATEGORY不就行了
从这个TABLE随机抽BRAND吗,用ORDER BY NEWID()取TOP 2
id | Category| Brand | Product | Other Columns
1 | 日本| 本田 | 刺猬壳
2 | 日本| 本田 | 阿阔的
3 | 日本| 本田 | 飞行员
4 | 日本| 本田 | 奥德赛
5 | 日本| 丰田 | 假美丽
6 | 日本| 丰田 | 烤肉啦
7 | 日本| 丰田 | 高地人
8 | 美国| 福特 | 金牛
9 | 美国| 福特 | 探索者 |
c*******e 发帖数: 9475 | 16 恕我愚钝,我的目的不是随机抽取品牌,而是选定若干品牌,比如所有日车和美车的
品牌,然后每个品牌随机抽取两个车型。用order by newid()取top 2我只会取
总共两个。如果每个选定品牌都要随机抽取两个车型,比如4个品牌就要选8个车型,
怎么做呢,用group by和having吗,我不知道怎么写
【在 s**********o 的大作中提到】 : 这不简单么,最后就是一个BRAND随机抽两个PRODUCT, : 1个BRAND只能是一类,JOIN上CATEGORY不就行了 : 从这个TABLE随机抽BRAND吗,用ORDER BY NEWID()取TOP 2 : id | Category| Brand | Product | Other Columns : 1 | 日本| 本田 | 刺猬壳 : 2 | 日本| 本田 | 阿阔的 : 3 | 日本| 本田 | 飞行员 : 4 | 日本| 本田 | 奥德赛 : 5 | 日本| 丰田 | 假美丽 : 6 | 日本| 丰田 | 烤肉啦
|
c*******e 发帖数: 9475 | 17 请问怎么给车排个序,每次随机取2个,求别笑话我
【在 s***s 的大作中提到】 : 我觉得可以先用unpivot 把table categories变成 : 1 |日车 | 本田 : 2 |日车 | 丰田 : 3 |美车 | 福特 : 4 |美车 | 通用 : ... : 然后 join table products : 这样得到 : 1 |日车 | 本田 |刺猬壳 : 2 |日车 | 本田 |阿阔的
|
B*****g 发帖数: 34098 | 18 top2是随便取2个,而不是随机取2个
【在 c*******e 的大作中提到】 : 恕我愚钝,我的目的不是随机抽取品牌,而是选定若干品牌,比如所有日车和美车的 : 品牌,然后每个品牌随机抽取两个车型。用order by newid()取top 2我只会取 : 总共两个。如果每个选定品牌都要随机抽取两个车型,比如4个品牌就要选8个车型, : 怎么做呢,用group by和having吗,我不知道怎么写
|
B*****g 发帖数: 34098 | 19 90%以上的数据库版SQL问题可以用partition by解决
Oracle version:
WITH t AS (
SELECT c.category, p.brand, p.product, ROW_NUMBER() OVER (PARTITION BY c.
category, p.brand ORDER BY dbms_random.value) rn
FROM Categories c, Products p
WHERE (p.brand = c.brand1 OR p.brand = c.brand2))
SELECT category, brand, product
FROM t
WHERE rn <= 2
【在 c*******e 的大作中提到】 : 嗯,对我这个外行复杂,对各位大牛可能是很简单的啦。 : 两个表 : Table Categories : Id |Category | Brand1 | Brand2 | Other Columns : 1 |日车 | 本田 | 丰田 : 2 |美车 | 福特 | 通用 : 3 |德车 | 大众 | : 4 。。。 : Table Products : Id | Brand | Product | Other Columns
|
c*******e 发帖数: 9475 | 20 太谢谢了,赞美给出了翔实的答案,好人一生平安!包子奉上
【在 B*****g 的大作中提到】 : 90%以上的数据库版SQL问题可以用partition by解决 : Oracle version: : WITH t AS ( : SELECT c.category, p.brand, p.product, ROW_NUMBER() OVER (PARTITION BY c. : category, p.brand ORDER BY dbms_random.value) rn : FROM Categories c, Products p : WHERE (p.brand = c.brand1 OR p.brand = c.brand2)) : SELECT category, brand, product : FROM t : WHERE rn <= 2
|
B*****g 发帖数: 34098 | 21 号召大家向crysknife学习,问了问题要给包子
【在 c*******e 的大作中提到】 : 太谢谢了,赞美给出了翔实的答案,好人一生平安!包子奉上
|
c*******e 发帖数: 9475 | 22 请问大牛知不知道这个问题改成MySQL怎么写,跪谢
【在 B*****g 的大作中提到】 : 号召大家向crysknife学习,问了问题要给包子
|