2010-10-20 1 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 = 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

+1

@Gaurav: добавьте определения этих таблиц в исходный вопрос. Трудно делать рекомендации, не понимая, как выглядят таблицы. Благодарю. –

0

Попробуйте использовать псевдоним, что-то, как это должно работать:

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

0

Вы должны иметь возможность присоединиться к подвыборке, чтобы вы только запускали запрос один раз. Затем вы можете выполнить условие соединения, чтобы вытащить максимум для идентификатора для каждой записи, как показано ниже:

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

Он не может распознать svn1.id в 'MaxDate.id = svn1.id'. Я попытался изменить его на 'FROM svn1 t' и' MaxDate.id = t.id', но это тоже не работает. > Ошибка: Неизвестный столбец 't.id' в 'on clause' – Gaurav

Смежные вопросы