【问题标题】:MySQL Inner Join with condition for the same tableMySQL内部连接与同一张表的条件
【发布时间】:2021-09-16 02:37:18
【问题描述】:

我有一个名为activities 的表,其中包括不同类型的活动,其中一些是相关的。 A 类型的每个活动都与B 类型的活动匹配,为简单起见,我们假设没有丢失数据。到目前为止,设置与this question 非常相似。

每个活动都有几列,包括activity_typerelated_activity_idlocation_id。我可以很容易地查询这些对:

SELECT 
A.location_id as 'A location id',
B.location_id as 'B location id'
FROM (SELECT * FROM activities WHERE `activities`.`activity_type` IN ('Activities::A') AND (`activities`.`related_activity_id` IS NOT NULL)) AS A
INNER JOIN (SELECT * FROM activities WHERE `activities`.`activity_type` IN ('Activities::B') AND (`activities`.`related_activity_id` IS NOT NULL)) AS B
ON A.related_act_id = B.id;

问题是当我想找到不匹配的对时,即A的位置与B的位置不匹配的对。我尝试过使用

WHERE A_location_id <> B_location_id

但它无法识别列:

错误代码:1054。“where”中的未知列“A_location_id” 子句' 0.734 秒

我不情愿地将where子句转换为:

WHERE A.location_id <> B.location_id

但是现在查询非常长,并且 MySQL 工作台窒息,最终杀死了查询:

错误代码:2013。在查询期间丢失与 MySQL 服务器的连接

我尝试过使用更长的超时查询,但它没有一点帮助。关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    对我来说不是很清楚,但也许你可以这样尝试

    SELECT 
    A.location_id as 'A location id',
    B.location_id as 'B location id'
    FROM activities c
    INNER JOIN activities parent ON parent.activity_type = c.activity_type
    WHERE related_activity_id IS NOT NULL AND c.location_id != p.location_id
    

    【讨论】:

      【解决方案2】:

      你可以在 MySQL 中使用 HAVING

      BUT SELECT * is bad From 因为你不需要所有列

          SELECT 
              A.location_id AS 'A location id',
              B.location_id AS 'B location id'
          FROM
              (SELECT 
                  *
              FROM
                  activities
              WHERE
                  `activities`.`activity_type` IN ('Activities::A')
                      AND (`activities`.`related_activity_id` IS NOT NULL)) AS A
                  INNER JOIN
              (SELECT 
                  *
              FROM
                  activities
              WHERE
                  `activities`.`activity_type` IN ('Activities::B')
                      AND (`activities`.`related_activity_id` IS NOT NULL)) AS B ON A.related_activity_id= B.id
          HAVING A_location_id <> B_location_id;
      

      所以我会将查询减少到,MySQL 必须处理更少的数据

      SELECT 
          A.location_id AS 'A location id',
          B.location_id AS 'B location id'
      FROM
          (SELECT 
              location_id,
              related_activity_id
          FROM
              activities
          WHERE
              `activities`.`activity_type` IN ('Activities::A')
                  AND (`activities`.`related_activity_id` IS NOT NULL)) AS A
              INNER JOIN
          (SELECT 
              location_id,
              id
          FROM
              activities
          WHERE
              `activities`.`activity_type` IN ('Activities::B')
                  AND (`activities`.`related_activity_id` IS NOT NULL)) AS B ON A.related_activity_id = B.id
      HAVING A_location_id <> B_location_id;
      

      最后如果查询仍然需要很长时间增加wait_timeout

      【讨论】:

      • YESSSSSS 这就是解决方案!谢谢一百万!
      猜你喜欢
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 2023-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-01
      相关资源
      最近更新 更多