MySQL - 左连接顺序被忽略
MySQL - Left join order being ignored
我正在尝试通过它的主键 DESC
对连接 table 进行排序,然后仅提取该记录以添加到数据集。
结构
ws_results
- 结果 ID (P)
- 结果日期时间
- 结果服务器
- 结果获胜者
ws_map
- 数据ID(p)
- resultID(通过 ID 链接到结果 table)
- 控制VS
- 控制NC
- 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
以上returns:
但这是不正确的,因为如果我 运行 子查询在它自己的查询中,就像这样:
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 使用 ON map.dataID = (SUBQUERY)
但这似乎也不适用于我的情况。
我已经在评论部分解释了为什么你的查询不起作用。您依赖多余的 ORDER BY
并且错误地使用了 GROUP BY
。
这是一种实现您想要的方法:为每个结果记录获取最匹配的地图记录(具有最高 dataID 的地图记录)。
Select 每个 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;
我正在尝试通过它的主键 DESC
对连接 table 进行排序,然后仅提取该记录以添加到数据集。
结构
ws_results
- 结果 ID (P)
- 结果日期时间
- 结果服务器
- 结果获胜者
ws_map
- 数据ID(p)
- resultID(通过 ID 链接到结果 table)
- 控制VS
- 控制NC
- 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
以上returns:
但这是不正确的,因为如果我 运行 子查询在它自己的查询中,就像这样:
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 使用 ON map.dataID = (SUBQUERY)
但这似乎也不适用于我的情况。
我已经在评论部分解释了为什么你的查询不起作用。您依赖多余的 ORDER BY
并且错误地使用了 GROUP BY
。
这是一种实现您想要的方法:为每个结果记录获取最匹配的地图记录(具有最高 dataID 的地图记录)。
Select 每个 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;