【问题标题】:MySQL Join on SubqueryMySQL 加入子查询
【发布时间】:2013-03-12 17:18:08
【问题描述】:

我正在尝试对子查询进行连接,尽管我无法获得所需的结果。有人可以建议运行更好的查询还是我不应该使用子查询(我不精通 SQL 的任何变体),是否有更好的查询类型可以运行?

根据我有限的 SQL 知识,我可以看到子查询不是最佳位置。这里的目标是从 tblResults 中查询字段,并将它们连接到 tblTraceOutput 中具有相同 resultid 的最后一行(tblTraceOutput 中有多行具有相同的 resultid 值,所以只有最后一行)。

SELECT r.`resultid`, r.`successful`, r.`result`, r.`testdate`, r.`changed`, 
t.`delay1`, t.`delay2`, t.`delay3` 
FROM `tblResults` AS r 
JOIN (
    SELECT `resultid`, `delay1`, `delay2`, `delay3` 
    FROM `tblTraceOutput` 
    WHERE `traceid`='48'
    ORDER BY `outputid` DESC LIMIT 0,1
) AS t ON (t.`resultid` = r.`resultid`) 
WHERE r.`traceid` = '48' ORDER BY r.`resultid` DESC LIMIT 0,20

如果我将 JOIN 更改为 LEFT JOIN,我将从我的查询中获得更多结果,但在 t.delay1t.delay2t.delay3 的三列​​中写入“NULL”,除了第一行之外的每一行。从子查询中提取的结果仅与 tblResults 上主查询的第一行输出联合。 我怎样才能让这个子查询运行并联合外部查询中的每一行输出?

在我的脑海中,我想到了以下内容,但我无法以任何方式使其工作:

SELECT r.`resultid`, r.`successful`, r.`result`, r.`testdate`, r.`changed` 
FROM `tblResults` AS r 
(
    SELECT t.`resultid`, t.`delay1`, t.`delay2`, t.`delay3` 
    FROM `tblTraceOutput` 
    WHERE `traceid`='48'
    ORDER BY `outputid` DESC LIMIT 0,1
) AS t
JOIN ON (t.`resultid` = r.`resultid`) 
WHERE r.`traceid` = '48' ORDER BY r.`resultid` DESC LIMIT 0,20

【问题讨论】:

    标签: mysql sql join greatest-n-per-group


    【解决方案1】:
    SELECT r.`resultid`, r.`successful`, r.`result`, r.`testdate`, r.`changed` 
    FROM `tblResults` AS r 
    LEFT JOIN `tblTraceOutput` as t ON (t.`resultid` = r.`resultid`) 
    WHERE r.`traceid` = '48' ORDER BY r.`resultid` DESC LIMIT 0,20
    

    即使没有匹配的结果,左连接也会从 tblTraceOutput 表返回结果(返回的数据为 NULL)

    inner join 只会返回 resultid 和 tblTraceOutput 匹配 ON 子句的结果

    【讨论】:

      【解决方案2】:

      我想这就是你要找的那个。该查询使用子查询分别获取表tblTraceOutput 上每个resultidresultid 的最新outputid。子查询的结果然后与表tblTraceOutput本身)连接回来,前提是它与子查询的所有列匹配。可能匹配的记录是最新的。

      SELECT  a.*, b.*
      FROM    tblResults a
              INNER JOIN tblTraceOutput b
                  ON a.resultid = b.resultid
              INNER JOIN
              (
                  SELECT  resultid, traceid, MAX(outputid) max_ID
                  FROM    tblTraceOutput
                  GROUP   BY resultid, traceid
              ) c ON  b.resultid = c.resultid AND
                      b.traceid = c.traceid
                      b.outputid = c.max_ID
      WHERE   a.traceid = 48
      ORDER   BY resultid
      LIMIT   0, 20
      

      【讨论】:

      • 太好了,谢谢先生。你今天教会了我一些新东西。我已经能够对我的需求进行微小的改动,这是完美的。我喜欢将第二张桌子加入自己的想法!谢谢:D
      【解决方案3】:

      您可以使用LEFT JOIN,只需在WHERE 子句中包含一个表达式,以避免显示连接表中没有关联记录的记录:

      SELECT r.`resultid`, r.`successful`, r.`result`, r.`testdate`, r.`changed`, 
      t.`delay1`, t.`delay2`, t.`delay3` 
      FROM `tblResults` AS r
      LEFT JOIN `tblTraceOutput` AS t ON (t.`resultid` = r.`resultid`)
      WHERE r.`traceid` = '48' AND t.`resultid` IS NOT NULL
      ORDER BY r.`resultid` DESC
      LIMIT 0, 20;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-20
        • 2011-12-23
        • 1970-01-01
        • 2019-03-13
        • 1970-01-01
        • 2017-10-10
        • 2015-12-21
        相关资源
        最近更新 更多