0

我试图从 2 个表中得到一些结果,它们是1 to n关系。我想从一个表中获取 2 列,Extensao从第二个表中获取一个结果HorarioExtensao。我试图按月份过滤,但我只想考虑第二列的较低日期,因为相同的结果可以有来自不同月份的多个日期。

我已经尝试过查询,HorarioExtensao然后SELECT使用. 提前致谢。MIN(h.hora) BETWEEN $inicial and $finalINNER JOINExtensaoe.nomee.codigo

$mes = $_GET["mes"];
$ano = $_GET["ano"];
$inicial = date("Y/m/d g:i:s",mktime(0,0,0,$mes,1,$ano));
$final = date("Y/m/t g:i:s",mktime(0,0,0,$mes,1,$ano));

$db = pg_connect("host=localhost dbname=saga user=**** password=****");
$result = pg_query($db,"SELECT e.nome, MIN(h.hora), e.codigo 
                        FROM Extensao e
                        INNER JOIN HorarioExtensao h ON h.idExtensao = e.idExtensao 
                        WHERE h.hora BETWEEN 
                                to_timestamp('$inicial','YYYY/MM/DD HH:MI:SS') AND
                                to_timestamp('$final','YYYY/MM/DD HH:MI:SS')
                        GROUP BY 3,1");

编辑

在桌子上:

- Extensao

----------------------
 | 身份证 | 名称 | 科迪戈 |
 |----|--------|--------|
 | 1 | N1 | 201 |
 | 2 | 氮气 | 223 |
 | 3 | N3 | 266 |
 ----------------------

- HorarioExtensao

--------------------------
 | idExtensao | 霍拉 |
 |------------|------------|
 | 1 | 2012-01-21 |
 | 1 | 2012-01-22 |
 | 1 | 2012-02-15 |
 | 1 | 2012-02-16 |
 --------------------------

如果我尝试选择 month 2,我不想得到任何结果,因为较低的日期idExtensao是第 1 个月。如果我选​​择 month 1,我只想得到 1 个结果,应该是N1,2012-01-21,201. 另外,我知道2012-01-21不是 a TIMESTAMP,我只是在简化。

4

2 回答 2

1

礼貌地说,这个问题留有解释的余地​​。

认为这可能是您正在寻找的: aLEFT [OUTER ] JOIN预聚合表上:

SELECT e.nome, h.min_hora, e.codigo
FROM   extensao e
LEFT   JOIN (
  SELECT idextensao, min(hora) AS min_hora
  FROM   horarioextensao
  GROUP  BY 1
  ) h ON h.idextensao = e.id
     AND h.min_hora >= to_timestamp($inicial, 'YYYY/MM/DD HH:MI:SS')
     AND h.min_hora <  to_timestamp($final, 'YYYY/MM/DD HH:MI:SS');

在子查询中,我从加入 to之前h选择最早的horaper idextensaofrom 。horarioextensao extensao

还要注意我如何将WHERE条件提升到LEFT JOIN条件中。这样,您就可以从中获取所有行,extensao并且只有那些horarioextensao与条件匹配的行。

如果您只希望其中的JOINextensao具有匹配的min_hora. 在这种情况下,条件可以留在WHERE子句中。

在您的示例中,一月的结果将是:

nome |  min_hora  |  codigo
-----+------------+---------
N1   | 2012-01-21 | 201
N2   | null       | 223
N3   | null       | 266

二月:

nome |  min_hora  |  codigo
-----+------------+---------
N1   | null       | 201
N2   | null       | 223
N3   | null       | 266

-> sqlfiddle

于 2012-12-13T05:13:42.393 回答
0

试试这个 SQL Server 语法 - 你需要翻译它,但它应该给你正确的想法

SELECT e.nome,MIN(h.hora),e.codigo 
FROM   Extensao e
       CROSS APPLY 
       (SELECT TOP(1) h.hora
       FROM HorarioExtensao h
       WHERE h.idExtensao = e.idExtensao
             AND
             h.hora >= to_timestamp('$inicial','YYYY/MM/DD HH:MI:SS')
             AND
             h.hora < to_timestamp('$final','YYYY/MM/DD HH:MI:SS')
       ORDER BY h.hora)
GROUP BY 3,1
于 2012-12-13T04:30:30.183 回答