表结构
----------------------------------------------------------
id username product_id
1 张三 363
2 李四 364
3 张三 365
4 王五 363需求:
找出既买了产品363又买了产品365的用户(即张三),sql怎么写?
数据量比较大,有没有不用表联结的写法?
----------------------------------------------------------
id username product_id
1 张三 363
2 李四 364
3 张三 365
4 王五 363需求:
找出既买了产品363又买了产品365的用户(即张三),sql怎么写?
数据量比较大,有没有不用表联结的写法?
(
select Username, product_id
from tablename
where product_id = 363
group by Username, product_id
),
t2 as
(
select Username, product_id
from tablename
where product_id = 365
group by Username, product_id
)
select Username
from t1
where Username in
(select Username
from t2)
WHERE EXISTS(SELECT 1 FROM TB WHERE username=T.username AND product_id=363) AND
EXISTS(SELECT 1 FROM TB WHERE username=T.username AND product_id=365)
兄台是mssql的写法 mysql中没有这种写法,有没有其它的实现方案
*
from
tb
where
username in(select username from tb group by username having count(1)=2)
and
product_id in('363','365')
查出来的username会很多的,如果用in效率会很低。
(SELECT username FROM TB WHERE product_id=363) b
(SELECT username FROM TB WHERE product_id=365) c
where b.username=c.username and a.username=c.username
username加了btree索引,product_id是int型的,没加索引,请问这样有问题吗?还有没有更好的办法
WHERE EXISTS(SELECT 1 FROM TB WHERE username=T.username AND product_id=363) AND
EXISTS(SELECT 1 FROM TB WHERE username=T.username AND product_id=365)
AND T.product_id IN(365,363)--把product_id 单独一个索引
username 单独一个
先试试看。索引有没有效有作用还要看你的数据量。数据结构这些
语句按上面的。
他里面是中文的所以会比较慢,而且数据量很大你可以测下
SELECT 1 FROM TB a, tb b WHERE a.username=b.username
如果这条语句也很慢的话那就是我说的这个原因了。
数据量是有点大,有100多万,不过username都是英文的。
直接用你这条语句不加限定条件的话会Out of memory
username是单独建了索引的,之前product_id也是有索引的,不过product_id是int类型,我试了一下,不加索引会更快一些。
username include(product_id)再试试
username include(product_id)再试试+1
363,365过滤后大概数据量在5万到15万之间
username include(product_id)再试试--这个没明白你的意思
试试这个语句有多少数据