有两个表tb_Goods和tb_GoodsCategoryCREATE TABLE tb_Goods(
GoodsID BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, -- 商品标识
GoodsName VARCHAR(200) NOT NULL DEFAULT '', -- *商品名称
PRIMARY KEY (GoodsID),
UNIQUE KEY(GoodsName)
)ENGINE=InnoDB DEFAULT CHARSET=gb2312;+---------+-------------------+
| GoodsID | GoodsName |
+---------+-------------------+
| 1 | 设计模式 |
| 2 | 设计思路整理 |
| 3 | 设计思路记录 |
| 4 | Ajax实战 |
| 5 | Ajax玩具 |
| 6 | 设计玩具 |
+---------+-------------------+
--R:商品所属分类信息表,一个商品可以属于多个分类
CREATE TABLE tb_GoodsCategory(
GoodsID BIGINT UNSIGNED NOT NULL DEFAULT '0', -- 商品标识
CategoryID BIGINT UNSIGNED NOT NULL DEFAULT '0', -- 所属分类
PRIMARY KEY(GoodsID, CategoryID)
)ENGINE=InnoDB DEFAULT CHARSET=gb2312;+---------+-------------------+
| GoodsID | CategoryID |
+---------+-------------------+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |
| 4 | 2 |
| 5 | 2 |
| 6 | 1 |
+---------+-------------------+搜索GoodsName中含有‘Ajax’的商品,并统计在每个类别(CategoryID)搜到的记录数,例如输出结果大致为:+---------+-------------------+
| GoodsID | GoodsName |
+---------+-------------------+
| 4 | Ajax实战 |
| 5 | Ajax玩具 |
+---------+-------------------+同时能得到分类1中有1个结果(商品4),分类2中有两个结果(商品4和5)。
能否用一条SELECT语句搞定?(可以使用用户变量)注意:
1、会使用GROUP BY GoodsID,因为有重复纪录
2、可能对GoodsID排序(升序和降序都可能)
3、同时结果要用LIMIT(因为记录数量多)
GoodsID BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, -- 商品标识
GoodsName VARCHAR(200) NOT NULL DEFAULT '', -- *商品名称
PRIMARY KEY (GoodsID),
UNIQUE KEY(GoodsName)
)ENGINE=InnoDB DEFAULT CHARSET=gb2312;+---------+-------------------+
| GoodsID | GoodsName |
+---------+-------------------+
| 1 | 设计模式 |
| 2 | 设计思路整理 |
| 3 | 设计思路记录 |
| 4 | Ajax实战 |
| 5 | Ajax玩具 |
| 6 | 设计玩具 |
+---------+-------------------+
--R:商品所属分类信息表,一个商品可以属于多个分类
CREATE TABLE tb_GoodsCategory(
GoodsID BIGINT UNSIGNED NOT NULL DEFAULT '0', -- 商品标识
CategoryID BIGINT UNSIGNED NOT NULL DEFAULT '0', -- 所属分类
PRIMARY KEY(GoodsID, CategoryID)
)ENGINE=InnoDB DEFAULT CHARSET=gb2312;+---------+-------------------+
| GoodsID | CategoryID |
+---------+-------------------+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |
| 4 | 2 |
| 5 | 2 |
| 6 | 1 |
+---------+-------------------+搜索GoodsName中含有‘Ajax’的商品,并统计在每个类别(CategoryID)搜到的记录数,例如输出结果大致为:+---------+-------------------+
| GoodsID | GoodsName |
+---------+-------------------+
| 4 | Ajax实战 |
| 5 | Ajax玩具 |
+---------+-------------------+同时能得到分类1中有1个结果(商品4),分类2中有两个结果(商品4和5)。
能否用一条SELECT语句搞定?(可以使用用户变量)注意:
1、会使用GROUP BY GoodsID,因为有重复纪录
2、可能对GoodsID排序(升序和降序都可能)
3、同时结果要用LIMIT(因为记录数量多)
解决方案 »
- 当 update 非常频繁的时候 ,mysql数据库架构怎么弄啊
- 重新开贴规范发SQL求解决!
- 关于 并发事务和锁的问题
- 如果有5百万左右的数据量~那下面的sql那个比较快啊?
- 储存过程、临时表、mysqldump
- mysql编码UTF-8问题,大虾帮忙!!!!!!!
- mysql 连接抱错,不知哪出问题,请大家帮忙。(焦急ing)
- why?
- :我用mysql连接mysql server时出现一个“host xxx.xxx.xxx.xx is not allowed to connec to this mysql server“,请问为什么??谢谢
- mysql 取数据
- MYSQL编译时出现的问题
- (散分)Linux下成功安装Mysql
[/align]
[/align]
¦ GoodsID ¦ GoodsName ¦Count1 ¦Count2 ¦
+---------+-------------------+-------+-------+
¦ 4 ¦ Ajax实战 ¦ 1 ¦ 2 ¦
¦ 5 ¦ Ajax玩具 ¦ 1 ¦ 2 ¦
+---------+-------------------+-------+-------+
Count1是类别1搜到的记录数
Count2是类别2搜到的记录数Count1和Count2存放到变量也可以。
[/align]
[/align]
[/align]
from tb_Goods as g ,
(select count(*) as Count1
from tb_GoodsCategory
where CategoryID=1
and GoodsID in (select GoodsID from GoodsName like '%Ajax%')
) as c1,
(select count(*) as Count2
from tb_GoodsCategory
where CategoryID=1
and GoodsID in (select GoodsID from GoodsName like '%Ajax%')
) as c2
where g.GoodsName like '%Ajax%'[align=center]==== 思想重于技巧 ====
[/align]
多谢了!
select * ,
(
select count(*) from (
SELECT a.* from tta a left join ttb b on a.GoodsID=b.GoodsID
where instr(GoodsName,'Ajax')>0 and b.CategoryID=1 )),
(
select count(*) from (
SELECT a.* from tta a left join ttb b on a.GoodsID=b.GoodsID
where instr(GoodsName,'Ajax')>0 and b.CategoryID=2 ))
from tta where instr(GoodsName,'Ajax')>0
(SELECT count(*) from tta a left join ttb b on a.GoodsID=b.GoodsID
where instr(a.GoodsName,'Ajax')>0 and b.CategoryID=2),
(SELECT count(*) from tta a left join ttb b on a.GoodsID=b.GoodsID
where instr(a.GoodsName,'Ajax')>0 and b.CategoryID=1)
from tta bbwhere instr(bb.GoodsName,'Ajax')>0
[/align]
但这种设计不好,只是可以满足一个SQL语句而已。[align=center]==== 思想重于技巧 ====
[/align]
[/align]
ASP / PHP / VB.C / .NET ?其实建议两个SQLselect GoodsID, GoodsName
from tb_Goods
where GoodsName like '%Ajax%'这个查询因为用的 like, 注定效率不会太高,INSTR也一样,没什么优化的余地。输出结果的同时生成 IN 字符串 GoodsID + ',' + GoodsID ...
IN 字符串 = "4,5"执行SQL2
select CategoryID,count(*)
from tb_GoodsCategory
where GoodsID in IN 字符串
group by CategoryID当然你可以把IN 转成 OR或许会有效率上的略微提高。[align=center]==== 思想重于技巧 ====
[/align]
看来只能使用临时表搞定了,好像MySQL中临时表要预先定义,不能使用一个变量存储,比较麻烦。
[/align]
SET @count1=0;
SET @count2=0;
SELECT *,@count1:=@count1+(CategoryID=1),@count2:=@count2+(CategoryID=2) FROM tb_Goods,tb_GoodsCategory WHERE GoodsName LIKE 'Ajax' AND tb_GoodsCategory.GoodsID=tb_Goods.GoodsID GROUP BY tb_Goods.GoodsID ORDER BY tb_Goods.GoodsID LIMIT 0,1
此时输出查询结果
+---------+-------------------+
¦ GoodsID ¦ GoodsName ¦
+---------+-------------------+
¦ 4 ¦ Ajax实战 ¦
¦ 5 ¦ Ajax玩具 ¦
+---------+-------------------+
然后使用
SELECT @count1;和SELECT @count2;查询统计数据但是@count1和@count2取出的是SELECT...LIMIT语句查询结果中的最后一条记录的值,还是不对!
[/align]