2012-10-30 2 views
0

날짜 간격을 기준으로 N 개의 행을 반환하는 쿼리를 만들어야합니다. 그것은 간단하지만 난 할 수 없습니다 :/MySQL은 날짜 간격에 따라 N 개의 행을 반환합니다.

기본 쿼리

SELECT 
    f.many_fields 
FROM 
    tb_foo f 
WHERE 
    f.id_foo = 14 

이 쿼리는 내 ID에 1 개 행을 기반으로 반환합니다. 그러나 '2012-10-10'과 같이 '2012-10-30'과 같은 날짜 간격을이 쿼리에 적용하면 끝날 때 기본 쿼리는 날짜 간격의 차이에 따라 20 행을 반환합니다.

가능합니까?

SELECT 
    f.many_fields, 
    bar.* 
FROM 
    tb_foo f, 
    (SELECT x FROM dual limit DATEDIFF('2012-10-10','2012-10-30')) bar 
WHERE 
    f.id_foo = 14 

실제 쿼리 : 내가 그리드를 구축 할의 iReport에이 결과를 사용합니다 2012년 10월 30일

SELECT 
    m.id_matricula, 
    a.nome 
FROM 
    tb_matricula m 
    inner join tb_aluno a on (a.id_aluno = m.id_matricula) 
WHERE 
    m.id_matricula = 14 

시작 날짜 = 2012년 10월 10일 종료 날짜 = 이 날짜의 차이에 따라 행 수가 달라집니다. 구글에 설립

예 검색 : 나는이에 대한 해결책을 발견했습니다

SELECT 
    CONCAT(dt.d ,'-' ,days.d) AS dates 
FROM 
    (
     SELECT 
      CONCAT(a1 ,b1) AS d 
     FROM 
      (
       SELECT 
        '0' AS a1 
      UNION ALL SELECT 
        '1' 
      UNION ALL SELECT 
        '2' 
      UNION ALL SELECT 
        '3' 
      ) a JOIN(
       SELECT 
        '0' AS b1 
      UNION ALL SELECT 
        '1' 
      UNION ALL SELECT 
        '2' 
      UNION ALL SELECT 
        '3' 
      UNION ALL SELECT 
        '4' 
      UNION ALL SELECT 
        '5' 
      UNION ALL SELECT 
        '6' 
      UNION ALL SELECT 
        '7' 
      UNION ALL SELECT 
        '8' 
      UNION ALL SELECT 
        '9' 
      ) b 
     WHERE 
      CONVERT(
       CONCAT(a1 ,b1) , 
       UNSIGNED 
      ) <=(
       SELECT 
        DAY(
         CONCAT('2012-10' ,'-01') + INTERVAL 1 MONTH - INTERVAL 1 DAY 
        ) 
      ) 
      AND CONCAT(a1 ,b1) <> '00' 
    ) days JOIN(
     SELECT 
      '2012-10' AS d 
    ) dt 
HAVING 
    dates BETWEEN '2012-10-02' AND '2012-10-05' 
ORDER BY 
    dates 
; 
+1

, 당신은 두 가지 특정 날짜 사이 뜻 그래서 나는이 있나요? 원하는 결과 집합은 무엇입니까? 당신의 이상적인 산출물의 예를 추가하십시오. – Ray

+1

테이블 구조를 보여주세요 – Justin

+0

실제로 두 날짜 사이에 레코드를 찾을 때'f.id_foo = 14'의 의미는 무엇입니까? 아니면 그 하나의 id 값에 대한 많은 레코드가 있습니까? – nawfal

답변

0

. 하위 쿼리를 사용하면 날짜 간격에 따라 많은 행을 반환 할 수 있습니다. 즉, 기본 쿼리와 아무런 관계가 없습니다.

SELECT 
    datas. * , 
    m.id_matricula , 
    p.nome 
FROM 
    tb_matricula m INNER JOIN tb_aluno a 
     ON(
     a.id_aluno = m.id_aluno 
    ) INNER JOIN tb_perfil p 
     ON(
     p.id_perfil = a.id_perfil 
    ) , 
    (
     SELECT 
      CONCAT(dt.d ,'-' ,days.d) AS dates 
     FROM 
      (
       SELECT 
        CONCAT(a1 ,b1) AS d 
       FROM 
        (
         SELECT 
          '0' AS a1 
        UNION ALL SELECT 
          '1' 
        UNION ALL SELECT 
          '2' 
        UNION ALL SELECT 
          '3' 
        ) a JOIN(
         SELECT 
          '0' AS b1 
        UNION ALL SELECT 
          '1' 
        UNION ALL SELECT 
          '2' 
        UNION ALL SELECT 
          '3' 
        UNION ALL SELECT 
          '4' 
        UNION ALL SELECT 
          '5' 
        UNION ALL SELECT 
          '6' 
        UNION ALL SELECT 
          '7' 
        UNION ALL SELECT 
          '8' 
        UNION ALL SELECT 
          '9' 
        ) b 
       WHERE 
        CONVERT(
         CONCAT(a1 ,b1) , 
         UNSIGNED 
        ) <=(
         SELECT 
          DAY(
           CONCAT('2012-02' ,'-01') + INTERVAL 1 MONTH - INTERVAL 1 DAY 
          ) 
        ) 
        AND CONCAT(a1 ,b1) <> '00' 
      ) days JOIN(
       SELECT 
        '2012-02' AS d 
      ) dt 
    UNION ALL SELECT 
      CONCAT(dt.d ,'-' ,days.d) AS dates 
     FROM 
      (
       SELECT 
        CONCAT(a1 ,b1) AS d 
       FROM 
        (
         SELECT 
          '0' AS a1 
        UNION ALL SELECT 
          '1' 
        UNION ALL SELECT 
          '2' 
        UNION ALL SELECT 
          '3' 
        ) a JOIN(
         SELECT 
          '0' AS b1 
        UNION ALL SELECT 
          '1' 
        UNION ALL SELECT 
          '2' 
        UNION ALL SELECT 
          '3' 
        UNION ALL SELECT 
          '4' 
        UNION ALL SELECT 
          '5' 
        UNION ALL SELECT 
          '6' 
        UNION ALL SELECT 
          '7' 
        UNION ALL SELECT 
          '8' 
        UNION ALL SELECT 
          '9' 
        ) b 
       WHERE 
        CONVERT(
         CONCAT(a1 ,b1) , 
         UNSIGNED 
        ) <=(
         SELECT 
          DAY(
           CONCAT('2012-03' ,'-01') + INTERVAL 1 MONTH - INTERVAL 1 DAY 
          ) 
        ) 
        AND CONCAT(a1 ,b1) <> '00' 
      ) days JOIN(
       SELECT 
        '2012-03' AS d 
      ) dt 
     ORDER BY 
      dates 
    ) datas 
WHERE 
    m.id_matricula = 42 
    and 
    datas.dates BETWEEN '2012-02-25' AND '2012-03-05'; 

ID이 문을 실행 날짜 차이 = 42 3 일 내가 가지고 : 당신이 날짜 간격을 말할 때

DATES,   ID_MATRICULA, NOME 
2012-02-25 42  R ANDRE F DOMINGOS 
2012-02-26 42  R ANDRE F DOMINGOS 
2012-02-27 42  R ANDRE F DOMINGOS 
관련 문제