【问题标题】:MySQL select distinct or group by optimizationMySQL 通过优化选择 distinct 或 group
【发布时间】:2017-11-18 03:56:30
【问题描述】:

我在从查询中获取唯一结果时遇到问题。 Detail 表有 800K 行,Matrix 表有 988K 行。有索引,但要么我没有设置正确的索引,要么它们不能用于查询。解释说细节表没有可能的键。矩阵显示可能的键,但键值为 NULL,Extra 表示:

Using where; Using join buffer (flat, BNL join)

查询:

SELECT
  Detail.Geocode AS Geocode,
  Detail.Taxtype AS Taxtype,
  Detail.TaxCat AS TaxCat,
  Detail.TaxAuthId AS TaxAuthId,
  Detail.TaxRate AS TaxRate,
  Detail.Fee AS Fee,
  Matrix.`Group` AS `Group`,
  Matrix.Item AS Item,
  Matrix.Customer AS Customer
FROM Detail
  LEFT OUTER JOIN Matrix
    ON Detail.Taxtype = Matrix.TaxType
    AND Detail.TaxCat = Matrix.TaxCat
    AND Detail.Geocode = Matrix.Geocode
    OR Matrix.Geocode = CONCAT(SUBSTR(Detail.Geocode, 1, 4), '00000000')
    AND Matrix.TaxAuthId = Detail.TaxAuthId
    OR ISNULL(Matrix.TaxAuthId)

执行上面的查询可以完成,但会导致大量重复。考虑到我正在使用的数据,我预计会这样。

我曾尝试使用 DISTINCT 和 GROUP BY,但它从未完成。

例如

GROUP BY Detail.Geocode,
         Detail.Taxtype,
         Detail.TaxCat,
         Detail.TaxAuthId,
         Detail.TaxRate,
         Detail.Fee,
         Matrix.`Group`,
         Matrix.Item,
         Matrix.Customer

我已经看到了一些将 DISTINCT 放置在连接内的示例,但我无法弄清楚如何使用我的查询正确执行此操作。

【问题讨论】:

  • 您的 ON 子句无法优化。我建议用样本数据、期望的结果以及对您想要实现的逻辑的解释提出另一个问题。
  • OR's w/o proper ()'s 可能是你的问题。使用 () 表示 OR 如何与 AND 一起操作。你这里有3个不同的条件吗?或更少/更多?当矩阵位于左连接的右侧时,检查 matrix.taxauthID 是否为空似乎真的很奇怪,尤其是在没有任何其他匹配条件的情况下。
  • 我看到你有 ON... AND AND AND AND OR AND OR.. 对我来说,这似乎是一种奇怪的方式来放置它们。我会把 ORS 放在最后,或者如果你想做的话,把它们放在括号里
  • 问题出在 () 上。

标签: mysql sql select distinct


【解决方案1】:

问题在于 ()。谢谢 xQbert!

SELECT
  Detail.Geocode AS Geocode,
  Detail.Taxtype AS Taxtype,
  Detail.TaxCat AS TaxCat,
  Detail.TaxAuthId AS TaxAuthId,
  Detail.TaxRate AS TaxRate,
  Detail.Fee AS Fee,
  Matrix.`Group` AS `Group`,
  Matrix.Item AS Item,
  Matrix.Customer AS Customer
FROM Detail
  LEFT OUTER JOIN Matrix
    ON Detail.Taxtype = Matrix.TaxType
    AND Detail.TaxCat = Matrix.TaxCat
    AND (Detail.Geocode = Matrix.Geocode
    OR Matrix.Geocode = CONCAT(SUBSTR(Detail.Geocode, 1, 4), '00000000'))
    AND (Matrix.TaxAuthId = Detail.TaxAuthId
    OR ISNULL(Matrix.TaxAuthId))

【讨论】:

    猜你喜欢
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2018-11-22
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多