跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 关于 mysql 两表查询,三列字段相等的一个问题
未分類
1 10 月 2020

关于 mysql 两表查询,三列字段相等的一个问题

关于 mysql 两表查询,三列字段相等的一个问题

資深大佬 : 0clickjacking0 1

目前情况是这样的,我有两张表,分别为 t1 和 t2,t1 中有字段( id,a,b,c ),t2 中有字段(name,a,b,c),想让这两表中的 a,b,c 字段相等时,查询出 id 和 name,我的查询语句如下select id,name from t1,t2 where(t1.a=t2.a and t1.b=t2.b and t1.c=t2.c),但是一直查不出来,也尝试过先把 a 字段相等的查到一张表上,但是数据量实在太大了,表直接满了,报错了,各位大师傅有啥办法吗

大佬有話說 (16)

  • 資深大佬 : xyjincan

    a,b,c where 顺序按表内重复数据量从小到大来,建立索引,这两个表还是合并吧

  • 資深大佬 : lychs1998

    试试连接?
    select t1.id,t2.name from t1 inner join t2 on t1.a = t2.a and t1.b = t2.b and t1.c = t2.c;

    不过其实最好还是弄个 t3 表,数据结构是 id,name,a,b,c 把两个表数据合并了最方便。

  • 主 資深大佬 : 0clickjacking0

    @lychs1998 我的思路是这样的,先把 a 相等的做一张临时表,然后在这张临时表中去查询 b 相等的,然后去查询 c 相等的,但是这样好像有问题,查不出来

  • 主 資深大佬 : 0clickjacking0

    @xyjincan 我的思路是这样的,先把 a 相等的做一张临时表,然后在这张临时表中去查询 b 相等的,然后去查询 c 相等的,但是这样好像有问题,查不出来

  • 資深大佬 : bowser1701

    @0clickjacking0 用连接不行吗?感觉你这种思路也不会比连接高效。

  • 資深大佬 : KomiSans

    select b01.id as id , b02.name as name from b1 b01 INNER JOIN b2 b02 ON b01.a = b02.a and b01.b = b02.b and b01.c = b02.c; ???

  • 資深大佬 : lpts007

    想求主个事
    能把表数据量,数据分布描述一下吗
    abc 重的多了肯定查不出来,你自己打算怎么办

  • 主 資深大佬 : 0clickjacking0

    @lpts007 表 1 大概 15 万条,表 2 大约 4900 条,就目前万想要的结果是 t1.a=t2.a and t1.b=t2.b and t1.c=t2.c 同时满足,但是查出来的貌似是笛卡尔积,有些数据有问题的,我去试试自然连接行不行,如果不行的话,考虑用 py 了,因为数据量也没有达到上百万的级别,用 py 也是无奈之举

  • 資深大佬 : wangritian

    t2 作主表(总行数少的),left join t1,t1 创建联合索引 a,b,c
    也可以增加字段计算 a,b,c 的哈希,对哈希字段创建索引,查询时不用管 a,b,c 了

  • 主 資深大佬 : 0clickjacking0

    @wangritian 那我是不是可以对 t1 和 t2 的 a,b,c 字段都计算哈希,然后直接去比较他们的哈希就行了,这样就变成了比较一个字段

  • 資深大佬 : lpts007

    @0clickjacking0
    “但是查出来的貌似是笛卡尔积” 那就对了,说明存在大量 abc 相等的数据
    假设
    表 t1
    |id | a| b| c|
    |1| a1|b1|c1|
    |2| a1|b1|c1|
    |3| a3|b3|c3|

    表 t2
    |name | a| b| c|
    |n1| a1|b1|c1|
    |n2| a1|b1|c1|
    |n3| a1|b1|c1|
    |n4| a3|b3|c3|

    结果会有 2 x 3 +1 x 1 = 7 条。那你的预期是不是查出 7 条呢?
    abc 重复记录越多,数据条数越多。
    你对俩表数据分布没有大体概念吗.

    我半瓶子水。

  • 資深大佬 : lpts007

    至于 hash 成一个字段再原样查——如果结果跟之前不一样的话,要么 hash 碰撞,要么 mysql 的 bug 。

  • 資深大佬 : zhangysh1995

    九靠谱 @wangritian
    主可能要给出表结构会更好一些。另外,如果 a,b,c 是组合外键好说,不是的话,为啥 name 没有也放在 t1 里面?感觉有些许奇怪。从查询来说,需要给 t2 加组合索引 (a,b,c) ,inner join 和 left join 区别不大,都是 index scan

  • 資深大佬 : vZexc0m

    试试先求和,然后对和做索引。然后缩小范围再查

  • 資深大佬 : PopRain

    select distinct id,name from t1,t2 where(t1.a=t2.a and t1.b=t2.b and t1.c=t2.c)

    你这个数据量一点都不大,查不出来说明满足条件的记录太多太多了。。。。 试试消重

  • 資深大佬 : wangritian

    @0clickjacking0 是的,这是哈希的作用之一,但不排除有哈希碰撞概率,在超大数据量时,哈希相等,还需要对应的 n 个字段也分别相等

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具