MySQL - 忽略左连接顺序

时间:2017-06-27 16:50:30

标签: mysql sql join sql-order-by

我尝试按其主键DESC订购联接表,并仅提取该记录以添加到数据集中。

结构

ws_results

  • ResultID(P)
  • ResultDateTime
  • ResultServer
  • ResultWinner

ws_map

  • dataID(p)
  • resultID(通过ID链接到结果表)
  • controlVS
  • controlNC
  • controlTR

查询

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

以上回报: enter image description here

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

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

enter image description here

结果不匹配,请注意第一组结果中的dataID不正确,即使它们已经订购并且具有相同的标准。

我已尝试过使用ORDER BY map.dataID DESC所做的一切,但似乎无法正常工作。我也在这里检查了答案:LEFT JOIN order and limit使用ON map.dataID = (SUBQUERY),但这似乎对我的情况不起作用。

1 个答案:

答案 0 :(得分:1)

我在评论部分解释了为什么您的查询无效。您依赖的是多余的ORDER BY而您使用GROUP BY的方式不正确。

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

选择每个resultID的最大数据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;