2010-10-20 56 views
4

我有一個表svn1:在同一表上寫的SQL查詢在MySQL中使用子查詢

id | date | startdate

23 2002-12-04 2000-11-11
23 2004-08-19 2005-09-10
23 2002-09-09 2004-08-23

select id,startdate from svn1 where startdate>=(select max(date) from svn1 where id=svn1.id);

現在的問題是我怎麼讓知道子查詢中與ID匹配ID在外部查詢中。顯然id = svn1.id不會工作。謝謝!

If you have the time to read more:

這真的是一個簡單的問題,問我真的想在這裏做什麼。我實際的查詢是這樣的

select 
      id, count(distinct archdetails.compname) 
    from 
      svn1,svn3,archdetails 
    where 
      svn1.name='ant' 
     and svn3.name='ant' 
     and archdetails.name='ant' 
     and type='Bug' 
     and svn1.revno=svn3.revno 
     and svn3.compname=archdetails.compname 
     and 
      ( 
      (startdate>=sdate and startdate<=edate) 
      or 
      (
      sdate<=(select max(date) from svn1 where type='Bug' and id=svn1.id) 
      and 
      edate>=(select max(date) from svn1 where type='Bug' and id=svn1.id) 
      ) 
      or 
      (
      sdate>=startdate 
      and 
      edate<=(select max(date) from svn1 where type='Bug' and id=svn1.id) 
      ) 
     ) 
     group by id LIMIT 0,40; 

正如你看到select max(date) from svn1 where type='Bug' and id=svn1.id,必須計算多次。

我可以只計算一次並使用AS存儲它,然後再使用該變量。主要問題是糾正id=svn1.id,以便將它正確地等同於外表中的id。

回答

1

我不知道你能消除子查詢的重複,但如果你使用一個表中的子查詢可以引用主查詢別名,如下所示:

select id, 
     count(distinct archdetails.compname) 
from svn1 s1, 
    svn3 s3, 
    archdetails a 
where s1.name='ant' and 
     s3.name='ant' and 
     a.name='ant' and 
     type='Bug' and 
     s1.revno=s3.revno and 
     s3.compname = a.compname and 
     ((startdate >= sdate and startdate<=edate) or 
     (sdate <= (select max(date) 
        from svn1 
        where type='Bug' and 
          id=s1.id and 
     edate>=(select max(date) 
        from svn1 
        where type='Bug' and 
        id=s1.id)) or 
     (sdate >= startdate and edate<=(select max(date) 
              from svn1 
              where type='Bug' and 
              id=s1.id))) 
group by id LIMIT 0,40; 

分享和享受。

+0

非常感謝。這正是我所期待的。但是這實際上增加了執行時間。雖然我沒有桌上的索引。通過查看查詢,什麼是創建索引的最佳列?或者使用其他方法? – Gaurav 2010-10-20 15:47:50

+1

@Gaurav:請將這些表格的定義添加到您的原始問題中。如果不理解表格的內容,很難提出建議。謝謝。 – 2010-10-20 16:00:46

0

使用別名嘗試,這樣的事情應該工作:

select s.id,s.startdate from svn1.s where s.startdate>=(select max(date) from svn1.s2 where s.id=s2.id);

0

您應該可以將其加入到子選擇中,以便只運行一次查詢。然後你可以做一個連接條件來拉出每個記錄上的ID的最大值,如下所示:

SELECT id, 
     COUNT(DISTINCT archdetails.compname) 
FROM svn1, 
     svn3, 
     archdetails 
LEFT JOIN (
     SELECT id, MAX(date) AS MaximumDate 
      FROM svn1 
      WHERE TYPE = 'Bug' 
      GROUP BY id 
     ) AS MaxDate ON MaxDate.id = svn1.id 
WHERE svn1.name = 'ant' 
     AND svn3.name = 'ant' 
     AND archdetails.name = 'ant' 
     AND TYPE = 'Bug' 
     AND svn1.revno = svn3.revno 
     AND svn3.compname = archdetails.compname 
     AND (
       (startdate >= sdate AND startdate <= edate) 
       OR (
         sdate <= MaxDate.MaximumDate 
         AND edate >= MaxDate.MaximumDate 
       ) 
       OR (
         sdate >= startdate 
         AND edate <= MaxDate.MaximumDate 
       ) 
      ) 
GROUP BY 
     id LIMIT 0, 
     40; 
+0

它無法識別'MaxDate.id = svn1.id'中的svn1.id。我試着把它改成'FROM svn1 t'和'MaxDate.id = t.id',但這似乎也不起作用。 >錯誤:'on子句'中的未知列't.id' – Gaurav 2010-10-20 16:26:34