【问题标题】:MySQL - Left join order being ignoredMySQL - 左连接顺序被忽略
【发布时间】:2017-11-30 20:01:09
【问题描述】:

我正在尝试通过其主键 DESC 对连接表进行排序,并仅提取该记录以添加到数据集中。

结构

ws_results

  • 结果ID (P)
  • 结果日期时间
  • 结果服务器
  • 结果获胜者

ws_map

  • 数据ID (p)
  • resultID(通过 ID 链接到结果表)
  • 控制VS
  • controlNC
  • 控制TR

查询

SELECT 
    results.ResultID,
    results.ResultDateTime,
    results.ResultServer,
    results.ResultWinner,
    map.resultID,
    map.dataID,
    map.vs,
    map.nc,
    map.tr
FROM ws_results AS results
LEFT JOIN (
    SELECT
        dataID,
        resultID,
        controlVS AS vs,
        controlNC AS nc,
        controlTR as tr
    FROM ws_map
    ORDER BY dataID DESC
) AS map ON map.resultID = results.ResultID 
WHERE results.ResultID = 38538
GROUP BY results.resultID

以上返回:

但这是不正确的,因为如果我像这样在它自己的查询中运行子查询:

SELECT
    dataID,
    resultID,
    controlVS AS vs,
    controlNC AS nc,
    controlTR as tr
FROM ws_map
WHERE resultID = 38538
ORDER BY dataID DESC
LIMIT 1

结果不匹配,请注意dataID 在第一组结果中不正确,即使它们都已排序且具有相同的条件。

我已经尝试过使用ORDER BY map.dataID DESC 的所有方法,但似乎没有用。我还在这里查看了答案:LEFT JOIN order and limit using ON map.dataID = (SUBQUERY) 但这似乎也不适用于我的情况。

【问题讨论】:

  • 子查询的顺序对连接没有用..顺序是为了呈现数据连接选择数据..这两个概念是不同的
  • 一张表没有顺序。派生表也是如此,即 from 子句中的子查询。您的 ORDER BY 子句被忽略。无论如何,您为什么期望您的GROUP BY results.resultID 会导致第一行地图?您没有指定要从地图中获取哪些值。你只会得到一个map.dataID,一个map.vs,等等,任意选择。它们甚至可以存在于不同的记录中。您的查询违反了标准,并会导致几乎所有其他 DBMS 出现错误。

标签: mysql sql join sql-order-by


【解决方案1】:

我已经在 cmets 部分解释了为什么您的查询无法工作。你依赖于一个多余的ORDER BY,而你错误地使用了GROUP BY。

这是实现您想要的一种方法:获取每个结果记录的最佳匹配地图记录(具有最高 dataID 的地图记录)。

选择每个 resultID 的最大 dataID 并使用它来访问相应的记录。

SELECT 
  results.resultid,
  results.resultdatetime,
  results.resultserver,
  results.resultwinner,
  map.resultid as map_resultid,
  map.dataid,
  map.vs,
  map.nc,
  map.tr
FROM ws_results AS results
LEFT JOIN
(
  SELECT
    resultid,
    max(dataid) as dataid
  FROM ws_map
  GROUP BY resultid
) best ON best.resultid = results.resultid
LEFT JOIN 
(
  SELECT
    dataid,
    resultid,
    controlvs as vs,
    controlnc as nc,
    controltr as tr
  FROM ws_map
) AS map ON map.resultid = best.resultid 
         AND map.dataid = best.dataid
WHERE results.resultid = 38538;

【讨论】:

  • 啊,是的,我没想过要使用MAX 来找出最高ID。我也没有意识到JOIN 忽略了ORDER BY,我发现我还有很多关于 SQL 的知识要学习。感谢您的解决方案!
猜你喜欢
  • 2018-09-15
  • 1970-01-01
  • 2011-10-18
  • 2017-07-01
  • 2020-02-18
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
相关资源
最近更新 更多