【问题标题】:MySQL join want to exclude rows if not in second table如果不在第二个表中,MySQL 连接想要排除行
【发布时间】:2014-06-28 11:37:34
【问题描述】:

我真的很崩溃,希望得到一些帮助;-)

我有这个 MySQL 查询:

SELECT
    sum(ot.value) AS total_value,
    avg(ot.value) AS avg,
    count(ot.value) AS count
FROM
    orders_total ot,
    orders o
WHERE
    ot.orders_id = o.orders_id
AND ot.class = 'ot_total'
AND o.customers_name != 'Test Test'
AND o.date_purchased >= '2014-02-01T00:00:00'
AND o.date_purchased < '2014-03-01T00:00:00'

但我只希望在 orders_id 同时在 orders 和 orders_total 表中时选择这些值。

因此,如果orders_total 表中缺少orders_id,我不希望它包含在查询中..

我尝试了左右连接,如下所示,没有任何运气;-(

SELECT
    sum(ot.value) AS total_value,
    avg(ot.value) AS avg,
    count(ot.value) AS count
FROM
    orders o
RIGHT JOIN orders_total ot ON (ot.orders_id = o.orders_id)
WHERE
    ot.orders_id = o.orders_id
AND ot.class = 'ot_total'
AND o.customers_name != 'Test Test'
AND o.date_purchased >= '2014-02-01T00:00:00'
AND o.date_purchased < '2014-03-01T00:00:00'

我做错了什么?

提前致谢! 巴斯

【问题讨论】:

  • 请在这里举例SQLFiddle
  • 你的原始查询应该做你想做的事。

标签: mysql left-join right-join


【解决方案1】:

试试这个..Inner JOIN 做你想做的事情。

 SELECT
        sum(ot.value) AS total_value,
        avg(ot.value) AS avg,
        count(ot.value) AS count
    FROM
        orders o
    INNER JOIN orders_total ot ON (ot.orders_id = o.orders_id)
    WHERE
    AND ot.class = 'ot_total'
    AND o.customers_name != 'Test Test'
    AND o.date_purchased >= '2014-02-01T00:00:00'
    AND o.date_purchased < '2014-03-01T00:00:00'

【讨论】:

  • OP 正在做同样的事情。唯一的区别是:他使用的是隐式连接语法,而您明确表示。
  • 您好 Charvee,感谢您的建议,非常感谢您的帮助!请参阅我对 Gordon 的评论.. Gordon 作为您的查询返回的结果与我的完全相同:-( 谢谢!巴斯
【解决方案2】:

说实话,我认为这不是join 问题。我认为你得到了错误的结果,认为这是一个连接问题。您的数据可能会使结果成倍增加。也许你真的想要:

SELECT sum(ot.value) AS total_value,
       avg(ot.value) AS avg,
       count(ot.value) AS count
FROM orders_total ot
WHERE ot.class = 'ot_total' AND
      EXISTS (select 1
              from orders o
              where ot.orders_id = o.orders_id and 
                    o.customers_name <> 'Test Test' and
                    o.date_purchased >= '2014-02-01T00:00:00' and
                    o.date_purchased < '2014-03-01T00:00:00'
            );

我这样说是因为您的 select 仅使用 orders_total 表中的列。这存在由于连接而导致值成倍增加的风险。

【讨论】:

  • 嗨,戈登,非常感谢您的反馈。奇怪的是,我和您的查询仍然返回完全相同的结果。虽然我 100% 确定在 orders_total 表中,但 order 表中不存在很多订单。有什么建议么?再次感谢!巴斯
猜你喜欢
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 2012-05-13
  • 2012-06-30
  • 2018-08-30
  • 2016-09-07
  • 2013-01-20
相关资源
最近更新 更多