1

私はテーブルを持っています:

CREATE TABLE `t` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user` varchar(100) DEFAULT NULL,
  `priority` int(11) DEFAULT NULL,
  `val1` varchar(100) DEFAULT NULL,
  `val2` varchar(100) DEFAULT NULL,
  `val3` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `t` VALUES (1,'tj',1,'Set-1',NULL,NULL),(2,'tj',5,'Z-invalid','Set-2',NULL),(3,'tj',10,'a-invalid','Z-invalid','Set-3');

データは次のようになります。

mysql> select * from t;
+----+------+----------+-----------+-----------+-------+
| id | user | priority | val1      | val2      | val3  |
+----+------+----------+-----------+-----------+-------+
|  1 | tj   |        1 | Set-1     | NULL      | NULL  |
|  2 | tj   |        5 | Z-invalid | Set-2     | NULL  |
|  3 | tj   |       10 | a-invalid | Z-invalid | Set-3 |
+----+------+----------+-----------+-----------+-------+

私がやりたいのは、優先度で並べ替え、データを折りたたむ、またはオーバーレイすることです。列の値が NULL の場合は、次に優先度の高い列から値を取得します。フィールドが null でない場合は、そこで停止します。

最終的には次のようになります。

+------+-----------+-----------+-------+
| user | val1      | val2      | val3  |
+------+-----------+-----------+-------+
| tj   | Set-1     | Set-2     | Set-3 |
+------+-----------+-----------+-------+

1 つのフィールドだけを取得する場合は、簡単です。

SELECT val1 FROM t WHERE user='tj' AND val1 IS NOT NULL ORDER BY priority ASC LIMIT 1;

しかし、このアイデアを実際に実装しようとしているテーブルには約 30 の列があり、30 の異なる選択をしたくありません。また、列自体の値の MAX ではなく、各列に表示する値を決定するのは優先順位であるため、MAX は使用できません。

ここで見逃している集計オプションはありますか?

4

1 に答える 1