【问题标题】:MySQL left join with LIMIT 1 not returning desired resultMySQL left join with LIMIT 1 未返回所需结果
【发布时间】:2018-05-19 12:27:31
【问题描述】:

我遇到了 SQL 查询问题;我正在尝试获取每个“资产”的最后服务日期。

我正在尝试将左连接与限制为 1 的子查询一起使用。

这是我的桌子:

lctn_test

testID, cleintID
1,      34
2,      34

srvc_test

srvcTestID, testID, serviceDate,            servicePassed
1,          1,      2018-05-19 03:23:53,    1
2,          1,      2018-05-19 11:46:49,    1
3,          2,      2018-05-19 11:47:24,    1

这是我尝试过的(以及一些变体)

SELECT 
    lctn.testID AS assetID, lctn.ClientID, 
    srvc_test.serviceDate, srvc_test.servicePassed
FROM 
    lctn_test AS lctn
LEFT JOIN 
    srvc_test ON lctn.testID = (SELECT srvc_test.testID
                                FROM srvc_test
                                WHERE srvc_test.testID = lctn.testID
                                ORDER BY srvc_test.serviceDate DESC
                                LIMIT 1)
WHERE 
    lctn.ClientID = 34
ORDER BY 
    assetID

我期望得到什么:

assetID,    ClientID,   serviceDate,            servicePassed
1,          34,         2018-05-19 11:46:49,    1
2,          34,         2018-05-19 11:47:24,    1

但这是我实际得到的:

assetID,    ClientID,   serviceDate,            servicePassed
1,          34,         2018-05-19 03:23:53,    1
1,          34,         2018-05-19 11:46:49,    1
1,          34,         2018-05-19 11:47:24,    1
2,          34,         2018-05-19 03:23:53,    1
2,          34,         2018-05-19 11:46:49,    1
2,          34,         2018-05-19 11:47:24,    1

我仍在学习 SQL (mysql),我一生都看不到这个问题;我打赌这是一个菜鸟的错误,但我只是没有看到它。

【问题讨论】:

  • 您应该使用srvcTestID 而不是testID 加入。
  • 什么是“资产”?
  • @PaulSpiegel 我无法加入 srvcTestID,因为它不是外键,lctn_test 表没有 srvcTestID。除非我没有理解你的意思。
  • @GordonLinoff 我正在录制的项目,例如可以是汽车。
  • ... ON srvc_test.srvcTestID = ( SELECT srvc_test.srvcTestID ... )

标签: mysql sql subquery left-join


【解决方案1】:

你有a LEFT JOIN b ON a.id = (sub-query)

你应该有a LEFT JOIN b ON b.id = (sub-query)

SELECT lctn.testID AS assetID, lctn.ClientID, srvc_test.serviceDate, srvc_test.servicePassed
FROM lctn_test AS lctn
LEFT JOIN srvc_test ON srvc_test.srvcTestID = (
    SELECT srvc_test.srvcTestID
    FROM srvc_test
    WHERE srvc_test.testID = lctn.testID
    ORDER BY srvc_test.serviceDate DESC
    LIMIT 1)
WHERE lctn.ClientID = 34
ORDER BY assetID

【讨论】:

  • 这会导致所有 3 项服务都被检索到,而我只想要每个“assetID”的最新信息
  • 不,你的编辑有效,我收回我之前的声明。
【解决方案2】:

如果您希望每个连接只有一行,则应在 ON 子句中使用连接表的唯一(或 PRIMARY)KEY。那可能是srvc_test.srvcTestID

SELECT lctn.testID AS assetID, lctn.ClientID, srvc_test.serviceDate, srvc_test.servicePassed
FROM lctn_test AS lctn
LEFT JOIN srvc_test ON srvc_test.srvcTestID = (
    SELECT srvc_test.srvcTestID
    FROM srvc_test
    WHERE srvc_test.testID = lctn.testID
    ORDER BY srvc_test.serviceDate DESC
    LIMIT 1)
WHERE lctn.ClientID = 34
ORDER BY assetID

【讨论】:

    【解决方案3】:

    您的查询缺少实际的join 条件:

    SELECT lctn.testID AS assetID, lctn.ClientID, srvc_test.serviceDate, srvc_test.servicePassed
    FROM lctn_test lctn LEFT JOIN
         srvc_test st
         ON st.testID = lctn.testID AND
            st.testID = (SELECT st2.testID
                         FROM srvc_test st2
                         WHERE st2.testID = st.testID
                         ORDER BY st.serviceDate DESC
                         LIMIT 1
                        )
    WHERE lctn.ClientID = 34
    ORDER BY assetID;
    

    我将关联条件切换为基于srvc_test 而不是lctn_test。这并没有什么不同。我只是发现为此目的引用单个表更简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-25
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 2011-10-16
      • 1970-01-01
      • 2013-11-28
      相关资源
      最近更新 更多