重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

エクセルで作ったような単純な縦横型のリレーショナル構造だとして、各列の一番大きな値を赤文字にしたいと思っています。
このとき、
(1)1回のクエリで全体を取得し、連想配列などにいれて各列をソートして1番大きな値を探す
(2)必要な回数分、適したクエリを投げて、結果を変数に格納し、IDなどで一致させる
という二通りのやり方を考えたのですが、どちらが一般的でしょうか。

(1)の場合は、DBに負荷がかからなくていいのかなと思いますが、多彩なフィルタやソートを使わずに、DBを使う意味があるんだろうかと考えてしまいます。
(2)の場合、列数が多いと、たとえば今回は5列分の結果を取得しようと思っていますが、1ページを表示させるのに5回DBへのアクセスがあることになり、運用としてどうなんだろうと考えた次第です。
アクセス数などにもよるのかと思いますが、一般的にこうする、というのがありましたら教えていただければと思います。
もちろん(1)(2)以外の方法でも歓迎です。
よろしくお願いします。

A 回答 (2件)

複数列というのがちょっと面倒なところですが


こんな感じでどうでしょう?

//元データ
CREATE TABLE tbl (id int not null primary key,d1 int,d2 int,d3 int,d4 int,d5 int,index(d1,d2,d3,d4,d5));
INSERT INTO tbl VALUES(1,1,2,3,4,2),(2,5,4,3,2,1),(3,4,2,1,5,3),(4,2,4,5,1,1),(5,3,2,1,1,2),(6,1,1,1,5,1),(7,2,3,1,5,1);

//集計
SELECT id
,d1,COALESCE((d1=m1),0) as f1
,d2,COALESCE((d2=m2),0) as f2
,d3,COALESCE((d3=m3),0) as f3
,d4,COALESCE((d4=m4),0) as f4
,d5,COALESCE((d5=m5),0) as f5
FROM tbl
LEFT JOIN (SELECT MAX(d1) as m1,MAX(d2) as m2,MAX(d3) as m3,MAX(d4) as m4,MAX(d5) as m5 FROM tbl) as sub
ON d1=m1 or d2=m2 or d3=m3 or d4=m4 or d5=m5
ORDER BY id
    • good
    • 0

自分でしたら、以下のテーブルがあったとき、



CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`value` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
);

INSERT INTO `test` (`id`, `value`)
VALUES
(1,10),
(2,20),
(3,29),
(4,3),
(5,28),
(6,18),
(7,11);

まず第一に試すのはこのクエリ
select
id
, value
, (value = (select max(value) from test)) as flg
from test

次に試すのがこの2つのクエリの組み合わせ。
select id, max(value) from test;
select id, value from test;

で、早い方を採用。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す