2011-04-13 48 views
4
---------- 
samples 
---------- 
SamplesID 
stylenumber 
stylename 
status 

----------- 
samples_details 
----------- 
Samples_Details_ID 
SamplesID 
CustomerName 
date_out 
date_returned 
updated (timestamp) 
status 

------------ 
samples_pictures 
------------ 
SamplesPicID 
SamplesID 

想写一个查询,让我从样本中的所有行,从samples_pictures所有比赛(如果有的话),并从samples_details最近的记录(如果有的话)。所以两个左外连接,但只检索最近的记录。MAX条件加入

什么是不工作:

SELECT samples.* 
    , samples_pictures.SamplesPicID 
    , CustomerName 
    , date_out 
    , date_returned 
    , updated 
    , samples_details.status as txn_status 
FROM samples 
    LEFT OUTER JOIN 
     (SELECT Samples_Details_ID 
      , samples_details.status as txn_status 
      , MAX(updated) as MaxUpdated 
     FROM samples_details 
     GROUP BY Samples_Details_ID 
    ) AS MaxTable 
     ON MaxTable.SamplesID = samples.SamplesID 
    LEFT OUTER JOIN samples_pictures 
     ON samples.SamplesID = samples_pictures.SamplesID 

任何援助将不胜感激!

+0

反向MaxTable.SamplesID和samples.samplesId? – Mikeb 2011-04-13 19:02:27

回答

1

在你的select语句中没有SamplesIDMaxTable。应该是:

SELECT samples.*, samples_pictures.SamplesPicID, CustomerName, date_out, 
date_returned, updated, samples_details.status as txn_status 
FROM samples 
    LEFT OUTER JOIN (SELECT SamplesID, Samples_Details_ID, samples_details.status as txn_status, 
    MAX(updated) as MaxUpdated FROM samples_details GROUP BY Samples_Details_ID) 
    AS MaxTable ON MaxTable.SamplesID = samples.SamplesID 
LEFT OUTER JOIN samples_pictures ON samples.SamplesID = samples_pictures.SamplesID 
1

原始查询仍然选择从samples_details每个记录。

您必须创建一个子查询来筛选出具有最大时间戳记的记录,并将其与samples_details表加回来以获取其他列。

SELECT * 
FROM  samples s 
     LEFT OUTER JOIN sample_details sd ON sd.SamplesID = s.SamplesID 
     INNER JOIN (
      SELECT SamplesID 
        , MAX(update) AS Update 
      FROM  samples_details 
      GROUP BY 
        SamplesID 
     ) sdm ON sdm.SamplesID = sd.SamplesID 
     LEFT OUTER JOIN samples_pictures sp ON sp.SamplesID = s.SamplesID 
+0

完美,谢谢@Lieven和@dgilland,正是我需要的! – TjJunior 2011-04-13 19:28:34

+0

@TJJunior,如果答案是正确的,你可以将其标记为这样,并奖励那些帮助你的志愿者,以表示赞赏。如果我们的答案都是正确的(就像你说的那样),“dgilland”首先回答。受到尊重的答案应该交给他。 – 2011-04-13 19:50:21

0
SELECT samples.* 
    , samples_pictures.SamplesPicID 
    , CustomerName 
    , date_out 
    , date_returned 
    , updated 
    , txn_status 
FROM samples 
    LEFT OUTER JOIN 
     (SELECT Samples_ID 
      , status as txn_status 
     FROM samples_details 
      INNER JOIN 
       (SELECT Samples_ID, 
         Samples_Details_ID 
        , MAX(updated) as MaxUpdated 
       FROM samples_details 
       GROUP BY Samples_ID, Samples_Details_ID 
      ) AS MaxTable 
       ON MaxTable.Samples_ID = samples.SamplesID 
       AND MaxTable.Samples_Details_ID = samples.Samples_Details_ID 
    ) AS MaxJoin 
    LEFT OUTER JOIN samples_pictures 
     ON samples.SamplesID = samples_pictures.SamplesID 
1
SELECT samples.* 
    , samples_pictures.SamplesPicID 
    , CustomerName 
    , date_out 
    , date_returned 
    , updated 
    , samples_details.status as txn_status 
FROM samples 
    LEFT OUTER JOIN samples_details 
     ON samples.SamplesID = samples_details.SamplesID 
     AND samples_details.updated = 
     (SELECT MAX(updated) 
     FROM samples_details 
      WHERE SamplesID = samples.SamplesID) 
    ) 
    LEFT OUTER JOIN samples_pictures 
     ON samples.SamplesID = samples_pictures.SamplesID 
+0

救了我几个小时:)好吧,也许只是十分钟......但是与我打算做的事情相比,这是非常聪明的!谢谢 – 2014-05-05 12:28:02