MySQL-忽略左连接顺序

MySQL-忽略左连接顺序,mysql,sql,join,sql-order-by,Mysql,Sql,Join,Sql Order By,我正试图按连接表的主键DESC对其进行排序,并仅取出该记录以添加到数据集 结构 ws_结果 结果(P) 结果日期 结果服务器 结果发生器 ws_地图 数据标识(p) resultID(通过ID链接到结果表) 控制阀 控制 控制 查询 上述申报表: 但这是不正确的,因为如果我在它自己的查询中运行子查询,如下所示: SELECT dataID, resultID, controlVS AS vs, controlNC AS nc, controlTR

我正试图按连接表的主键
DESC
对其进行排序,并仅取出该记录以添加到数据集

结构 ws_结果
  • 结果(P)
  • 结果日期
  • 结果服务器
  • 结果发生器
ws_地图
  • 数据标识(p)
  • resultID(通过ID链接到结果表)
  • 控制阀
  • 控制
  • 控制
查询 上述申报表:

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

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
不正确,即使它们都是有序的并且具有相同的条件


我尝试了所有方法,从使用
orderbymap.dataID DESC
,但似乎都不起作用。我也在这里找到了答案:在map.dataID=(子查询)上使用
,但这似乎对我的情况也不起作用。

我在评论部分解释了为什么查询不能起作用。您依赖的是多余的
ORDER BY
,并且您使用的
GROUP BY
不正确

这里有一种方法可以实现您想要的:获得每个结果记录的最佳匹配映射记录(具有最高数据ID的记录)

选择每个resultID的最大数据ID,并使用该ID访问相应的记录

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;

子查询的顺序对于联接无效。。顺序是显示数据,连接用于选择数据。。这两个概念是不同的。表没有顺序。派生表也是如此,即from子句中的子查询。您的
orderby
子句将被忽略。不管怎样,为什么您希望您的
groupbyresults.resultID
会产生第一个映射行?您没有指定要从映射中获取的值。您只需任意选择一个
map.dataID
、一个
map.vs
等。它们甚至可以存在于不同的记录中。您的查询违反了标准,并将导致几乎所有其他DBMS中出现错误。啊,是的,我没有想到使用
MAX
来计算顶级ID。我也没有意识到
JOIN
忽略
ORDER BY
,我发现我在SQL方面还有很多需要学习的地方。感谢您的解决方案!
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;