MySQL Solution
I think I got it !!!!
Query for the First Answer:
SELECT A.ID,A.CATEGORY FROM
(SELECT ID,CATEGORY,ORD FROM DATAS GROUP BY ID,CATEGORY) A
INNER JOIN
(SELECT MIN(ORD) ORD FROM DATAS) B
USING (ORD);
Query for the Second Answer:
SELECT AA.ID,AA.CATEGORY FROM
(SELECT ID,CATEGORY,IFNULL(AAA.ORD,BBB.ORD) ORD FROM DATAS AAA,
(SELECT MIN(ORD) ORD FROM DATAS) BBB) AA
INNER JOIN
(SELECT MIN(ORD) ORD FROM DATAS) BB
USING (ORD)
GROUP BY AA.CATEGORY,AA.ORD;
The second answer was a little difficult because I had to find a way to replace the NULL with the minumum ORD value. I hope this is what you were thinking to do with the NULL. If you look at subquery BBB, that held the minumum ORD value. I used that in a cartesian product with subquery AAA as the means to replace the NULL ORD value. The rest got easier after that.
Here is the example run for the First Query:
mysql> use tostinni
Database changed
mysql> DROP TABLE IF EXISTS DATAS;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CREATE TABLE DATAS (
-> ID INT(2) ,
-> CATEGORY INT(2) ,
-> ORD INT(1)
-> );
Query OK, 0 rows affected (0.06 sec)
mysql> INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (1, 1, 3), (2, 1, 2), (3, 1, 1), (4, 2, 1), (5, 2, 2);
Query OK, 5 rows affected (0.03 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM DATAS;
+------+----------+------+
| ID | CATEGORY | ORD |
+------+----------+------+
| 1 | 1 | 3 |
| 2 | 1 | 2 |
| 3 | 1 | 1 |
| 4 | 2 | 1 |
| 5 | 2 | 2 |
+------+----------+------+
5 rows in set (0.00 sec)
mysql> SELECT A.ID,A.CATEGORY FROM
-> (SELECT ID,CATEGORY,ORD FROM DATAS GROUP BY ID,CATEGORY) A
-> INNER JOIN
-> (SELECT MIN(ORD) ORD FROM DATAS) B
-> USING (ORD);
+------+----------+
| ID | CATEGORY |
+------+----------+
| 3 | 1 |
| 4 | 2 |
+------+----------+
2 rows in set (0.00 sec)
mysql>
Here is the example run for the Second Query:
mysql> DROP TABLE IF EXISTS DATAS;
Query OK, 0 rows affected (0.05 sec)
mysql> CREATE TABLE DATAS (
-> ID INT(2) ,
-> CATEGORY INT(2) ,
-> ORD INT(1)
-> );
Query OK, 0 rows affected (0.08 sec)
mysql> INSERT INTO DATAS (ID, CATEGORY, ORD)
-> VALUES (1, 1, 3), (2, 1, 2), (3, 1, 1), (4, 2, 1), (5, 2, 1), (6, 3, NULL), (7, 3, NULL);
Query OK, 7 rows affected (0.03 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM DATAS;
+------+----------+------+
| ID | CATEGORY | ORD |
+------+----------+------+
| 1 | 1 | 3 |
| 2 | 1 | 2 |
| 3 | 1 | 1 |
| 4 | 2 | 1 |
| 5 | 2 | 1 |
| 6 | 3 | NULL |
| 7 | 3 | NULL |
+------+----------+------+
7 rows in set (0.00 sec)
mysql> SELECT AA.ID,AA.CATEGORY FROM
-> (SELECT ID,CATEGORY,IFNULL(AAA.ORD,BBB.ORD) ORD FROM DATAS AAA,(SELECT MIN(ORD) ORD
FROM DATAS) BBB) AA
-> INNER JOIN
-> (SELECT MIN(ORD) ORD FROM DATAS) BB
-> USING (ORD)
-> GROUP BY AA.CATEGORY,AA.ORD;
+------+----------+
| ID | CATEGORY |
+------+----------+
| 3 | 1 |
| 4 | 2 |
| 6 | 3 |
+------+----------+
3 rows in set (0.00 sec)
mysql>
Give it a Try !!!