2

私が欲しいもの:グループごとの最大の問題で問題が発生しています。私のグループはTCPアドレスのセットであり、nはテーブル行がデータベースに挿入された日付です。

問題:現在、tcpアドレスごとに最大の日付を持つ行ではなく、where句に一致するtcpアドレスを持つすべての行を取得しています。

私はこの例に従おうとしていますが失敗します:SQL列の最大値を持つ行のみを選択します

これが私のテーブルの様子です。

CREATE TABLE IF NOT EXISTS `xactions` (
  `id` int(15) NOT NULL AUTO_INCREMENT,
  `tcpAddress` varchar(40) NOT NULL,
   //a whole lot of other stuff in batween
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=150 ;

行の例は

ID | tcpAddress     | ...  | date
1  |  192.168.1.161 | ...  | 2012-09-12 14:19:39
2  |  192.168.1.162 | ...  | 2012-09-12 14:19:40
3  |  192.168.1.162 | ...  | 2012-09-12 14:19:41
4  |  192.168.1.162 | ...  | 2012-09-12 14:19:42

使用しようとしているSQLステートメント

select yt.id, yt.tcpAddress, yt.analog, yt.discrete, yt.counter, yt.date
from xactions yt
inner join(
    select id, tcpAddress, analog, discrete, counter, max(date) date
    from xactions
    WHERE tcpAddress='192.168.1.161' OR tcpAddress='192.168.1.162'
    group by date
) ss on yt.id = ss.id and yt.date= ss.date
4

2 に答える 2

1

日付ではなく、tcpAddressでグループ化する必要があります。

そして、IDではなくtcpAddressで参加します。

select yt.id, yt.tcpAddress, yt.analog, yt.discrete, yt.counter, yt.date 
from xactions yt 
inner join ( 
  select tcpAddress, max(date) date 
  from xactions 
  where tcpAddress in ('192.168.1.161', '192.168.1.162')
  group by tcpAddress
 ) ss using (tcpAddress, date);

また、派生テーブルで追加の列を選択する必要はありません。tcpAddressとmax(date)のみを選択します。

于 2013-03-14T21:54:02.820 に答える
1

また、EXISTS()でオプションを使用することもできます。EXISTS()で、tcpAddressの各グループのMAX(date)を見つけて、それらを比較します

SELECT id, tcpAddress, analog, discrete, counter, date
FROM xactions x1    
WHERE EXISTS (
              SELECT 1
              FROM xactions x2
              WHERE x1.tcpAddress = x2.tcpAddress
              HAVING MAX(x2.date) = x1.date
              ) AND (tcpAddress='192.168.1.161' OR tcpAddress='192.168.1.162')
于 2013-03-14T21:55:32.287 に答える