由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Database版 - 求教一个复杂的query
相关主题
SQL问题请教: add one more column如何only update the first occurrence in a table
SQL combine two columns from two different tables no shared (转载)help about SQL for ACCESS
Table Merge (SQL Server)column in table point to another table
其实有个问题好久没有明白!mysql maximum columns <=1000?
analyze 在oracle里怎么用?Q on adding new column
问个external table field definition的问题Basic oracle questions.
初级问题Please help: Innodb table could not drop a column
请教一个问题Re: Please help: Innodb table could not
相关话题的讨论汇总
话题: 本田话题: brand话题: 品牌话题: table话题: 随机
进入Database版参与讨论
1 (共1页)
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

相关主题
问个external table field definition的问题如何only update the first occurrence in a table
初级问题help about SQL for ACCESS
请教一个问题column in table point to another table
进入Database版参与讨论
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学习,问了问题要给包子
1 (共1页)
进入Database版参与讨论
相关主题
Re: Please help: Innodb table could notanalyze 在oracle里怎么用?
Help on Sql server huge table performance问个external table field definition的问题
Join optimization初级问题
HELP: 如何实现 一个简单的Query请教一个问题
SQL问题请教: add one more column如何only update the first occurrence in a table
SQL combine two columns from two different tables no shared (转载)help about SQL for ACCESS
Table Merge (SQL Server)column in table point to another table
其实有个问题好久没有明白!mysql maximum columns <=1000?
相关话题的讨论汇总
话题: 本田话题: brand话题: 品牌话题: table话题: 随机