0

2 つのテーブルから結果を取得しようとしていますが、それらは1 to nリレーションです。Extensao1 つのテーブルから 2 つの列を取得し、2 番目のテーブルから 1 つの結果を取得したいと考えていますHorarioExtensao。月ごとにフィルター処理しようとしていますが、同じ結果に異なる月の複数の日付が含まれる可能性があるため、2 番目の列の下の日付を考慮したいだけです。

私はすでにクエリを実行してから、を使用しHorarioExtensaoて別のクエリを実行しようとしましたが、問題はそこにあり、 forを選択する場所とを配置する場所がわかりません。前もって感謝します。SELECTMIN(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");

編集

テーブル:

- エクステンサオ

----------------------
 | | ID | ノメ | コディゴ |
 |----|------|--------|
 | | 1 | N1 | 201 |
 | | 2 | N2 | 223 |
 | | 3 | N3 | 266 |
 ----------------------

- ホラリオエクステンサオ

---------------------------
 | | idExtensao | ホラ |
 |------------|------------|
 | | 1 | 2012-01-21 |
 | | 1 | 2012-01-22 |
 | | 1 | 2012-02-15 |
 | | 1 | 2012-02-16 |
 ---------------------------

month を選択しようとすると2、結果を取得したくありません。これは、同じ日付がidExtensao月 1の1ものであるためN1,2012-01-21,201です。また、私は単純化しているだけで2012-01-21はないことを知っています。TIMESTAMP

4

2 に答える 2

1

この質問には、丁寧に言えば解釈の余地があります。

これはあなたが探しているものかもしれないと思います: a事前LEFT [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');

サブクエリでは、 fromに参加するhの最も早いhoraperを選択します。idextensaohorarioextensao extensao

WHERE条件を条件にプルアップする方法にも注意してくださいLEFT JOIN。このようにして、すべての行を取得し、条件に一致するextensao行のみを取得します。horarioextensao

一致する を持つJOIN行のみが必要な場合は、プレーンに変更します。この場合、条件は句にとどまることができます。extensaomin_horaWHERE

この例での 1 月の結果は次のようになります。

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

2 月の場合:

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 に答える