1

コンポーネントの名前と有効期限を列に保持するテーブルがあり、3 番目の列には、コンポーネントがインストールされているフレーム (frame_id) のアドレスが保持されます。1 つのフレームに多くの (またはまったく) コンポーネントが取り付けられています。

各フレームで最初に期限切れになるコンポーネントのリストを取得する必要があります。フレームごとに 1 行のみ。たとえば、フレームが 50 個ある場合、フレームごとに最初に有効期限が切れるコンポーネントの日付、名前、および ID が必要になります。単純な GROUP BY ではそれができないようです。

Table1
expiry     | name        | frame_id | component_id
-------------------------------------------------
2013-10-03 | component_1 | 0320     | 127
2013-11-12 | component_1 | 0275     | 461
2013-11-22 | component_4 | 0320     | 011
2014-01-05 | component_2 |          | 224
2014-01-16 | component_3 | 0275     | 782

リストは次のようになります。

0320 2013-10-03, expiring component: component_1 id: 127
0275 2013-11-12, expiring component: component_1 id: 461

最初に期限が切れるコンポーネントの有効期限が記載された固有のフレームのみがリストされます

ありがとう!

4

2 に答える 2

1

SQLフィドルが機能していないので、ここにコードを追加します。

CREATE TABLE `TableTT1` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `expiry` date NOT NULL,
  `name` varchar(16) NOT NULL,
  `frame_id` int(11) DEFAULT NULL,
  `component_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;


INSERT INTO `TableTT1` (`expiry`, `name`, `frame_id`, `component_id`)
VALUES
('2013-10-03', 'component_1', 0320, 127), 
('2013-11-12', 'component_1', 0275, 461), 
('2013-11-22', 'component_4', 0320, 011), 
('2014-01-05', 'component_2',  null, 224), 
('2014-01-16', 'component_3', 0275, 782);


    SELECT * FROM TableTT1;  

+----+------------+-------------+----------+--------------+
| ID | expiry     | name        | frame_id | component_id |
+----+------------+-------------+----------+--------------+
|  1 | 2013-10-03 | component_1 |      320 |          127 |
|  2 | 2013-11-12 | component_1 |      275 |          461 |
|  3 | 2013-11-22 | component_4 |      320 |           11 |
|  4 | 2014-01-05 | component_2 |     NULL |          224 |
|  5 | 2014-01-16 | component_3 |      275 |          782 |
+----+------------+-------------+----------+--------------+


SELECT 
    MIN(expiry) AS expFirst, 
    GROUP_CONCAT(frame_id, ' ', expiry, ' ', name, ' ', component_id) AS Details
FROM TableTT1 
GROUP BY frame_id, name 
ORDER BY expFirst;

+------------+--------------------------------+
| expFirst   | Details                        |
+------------+--------------------------------+
| 2013-10-03 | 320 2013-10-03 component_1 127 |
| 2013-11-12 | 275 2013-11-12 component_1 461 |
| 2013-11-22 | 320 2013-11-22 component_4 11  |
| 2014-01-05 | NULL                           |
| 2014-01-16 | 275 2014-01-16 component_3 782 |
+------------+--------------------------------+

お役に立てれば。

于 2013-08-13T12:36:47.180 に答える
0

これを試して:

SELECT
    MIN(expiry), frame_id
FROM Table1
GROUP BY frame_id
于 2013-08-13T12:05:27.443 に答える