はあなたが必要とするクエリです:
ここ
SELECT DISTINCT B.* FROM
(SELECT ID,`Signal`,MIN(CONCAT(Station,'-',Owner)) MaxStationOwner
FROM (SELECT DISTINCT t.* FROM
(SELECT ID,MAX(`Signal`) `Signal` FROM t GROUP BY ID) AAA
LEFT JOIN t USING (ID,`Signal`)) AA
GROUP BY ID,`Signal`) A
INNER JOIN t B
ON A.MaxStationOwner=CONCAT(B.Station,'-',B.Owner)
AND A.ID=B.ID AND A.`Signal`=B.`Signal`;
あなたのサンプルデータは、次のとおりです。ここで
drop database if exists preeti;
create database preeti;
use preeti
create table t
(ID int not null,
`Signal` int not null,
Station varchar(10),
Owner varchar(10));
insert into t values
(111, -120 , 'Home' , 'M1'),
(111, -120 , 'Home' , 'M1'),
(111, -120 , 'Home' , 'M2'),
(111, -120 , 'Car' , 'M1'),
(111, -120 , 'Car' , 'M2'),
(111, -120 , 'Work' , 'M1'),
(111, -120 , 'Dept' , 'M3'),
(111, -130 , 'Car' , 'M1'),
(111, -135 , 'Work' , 'M2'),
(222, -98 , 'Home' , 'M2'),
(222, -95 , 'Work' , 'M1'),
(222, -103 , 'Work' , 'M2');
はあなたのサンプルデータがロードされます。
ここで
mysql> drop database if exists preeti;
Query OK, 1 row affected (0.03 sec)
mysql> create database preeti;
Query OK, 1 row affected (0.00 sec)
mysql> use preeti
Database changed
mysql> create table t
-> (ID int not null,
-> `Signal` int not null,
-> Station varchar(10),
-> Owner varchar(10));
Query OK, 0 rows affected (0.06 sec)
mysql> insert into t values
-> (111, -120 , 'Home' , 'M1'),
-> (111, -120 , 'Home' , 'M1'),
-> (111, -120 , 'Home' , 'M2'),
-> (111, -120 , 'Car' , 'M1'),
-> (111, -120 , 'Car' , 'M2'),
-> (111, -120 , 'Work' , 'M1'),
-> (111, -120 , 'Dept' , 'M3'),
-> (111, -130 , 'Car' , 'M1'),
-> (111, -135 , 'Work' , 'M2'),
-> (222, -98 , 'Home' , 'M2'),
-> (222, -95 , 'Work' , 'M1'),
-> (222, -103 , 'Work' , 'M2');
Query OK, 12 rows affected (0.06 sec)
Records: 12 Duplicates: 0 Warnings: 0
mysql>
が出力されます。
mysql> SELECT DISTINCT B.* FROM
-> (SELECT ID,`Signal`,MIN(CONCAT(Station,'-',Owner)) MaxStationOwner
-> FROM (SELECT DISTINCT t.* FROM
-> (SELECT ID,MAX(`Signal`) `Signal` FROM t GROUP BY ID) AAA
-> LEFT JOIN t USING (ID,`Signal`)) AA
-> GROUP BY ID,`Signal`) A
-> INNER JOIN t B
-> ON A.MaxStationOwner=CONCAT(B.Station,'-',B.Owner)
-> AND A.ID=B.ID AND A.`Signal`=B.`Signal`;
+-----+--------+---------+-------+
| ID | Signal | Station | Owner |
+-----+--------+---------+-------+
| 111 | -120 | Car | M1 |
| 222 | -95 | Work | M1 |
+-----+--------+---------+-------+
2 rows in set (0.02 sec)
mysql>
はそれを試してみます!
CAVEAT
あなたは、テーブルtにこのインデックスを持っていることを確認してください:
ALTER TABLE t ADD INDEX ID_Signal_Index (ID,`Signal`);
あなたは、行が一意になり、この表の他の列を持っていますか?プライマリキーかもしれない? – piotrm
'SELECT'の直後に' DISTINCT'を使ってみてください –
Signalは主にストアドプロシージャで使用される予約語なので、Signalの前後に引用符を追加しました。 – RolandoMySQLDBA