こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

二次元配列のソートについて

PHPでデータベースの複数のテーブルから
ID、名前、かな、点数といったデータを
読み込んでテーブルに保存しています。

SELECT id, name, kana, tensu FROM a, b, c
ORDER BY tensu

といった形で出来ると思っていたのですが
エラーが出てできませんでした。

そこで各テーブルのデータを
読み込んで二次元配列にしてソート
してみたのですが、なぜか以下のソースだと
データが重複されて表示されて
困っています。

$saidai = count($tbl);

for ($i=0 ;$i<$saidai;$i++){
 $sort[$i] = $i;
}

for($i=0;$i<$saidai;$i++){
 for($j=0;$j<$saidai;$j++){
  if($tbl[$sort[$i]][2] > $tbl[$sort[$j]][2]){
   $work = $sort[$i];
   $sort[$i] = $sort[$j];
   $sort[$j] = $work;
  }
 }
 表示
}

こんな感じですがどうも繰り返しても
同じデータばかりが表示されます。
いろいろ試してみましたが結局出来ませんでした。
表示するデータがかぶらないようにするには
どうすればよろしいですか?
お願いいたします。

投稿日時 - 2005-06-05 18:09:14

QNo.1430920

すぐに回答ほしいです

質問者が選んだベストアンサー

No1さんが指摘さていますが、同じデータが表示されてしまう原因は結合条件がないためです。これはPHPのコードとは関係がないので、mysqlクライアントでぜひ実験してみて下さい。

例えばレコードがテーブルaに10件,bに2件入ってるとします。このテーブルに対してmysqlクライアントで
select count(*) from a,b;
と入力してみて下さい。質問者の方はこの時12件表示される事を期待していませんか?でも実際には20件と表示されるはずです。

これはつまりテーブルの結合は足し算ではなく掛け算なんです。結合条件が無い結合の場合、指定したテーブル全てのレコードの全組み合わせが表示されます。

例としてフィールドが一つのテーブルaに2個のレコード
valuea
1
2
同じくフィールドが一つのテーブルbに3個のレコード
valueb
3
4
5
ここでselect valuea,valueb from a,b;というSQLを実行すると
valuea valueb
1 3
2 3
1 4
2 4
1 5
2 5

と、取得されるレコードは2×3で6個、もしSQL分のフィールド指定がvalueaだけだったとしたら
1
2
1
2
1
2
と、同じデータが出力される事になります。

恐らくこういう原因だと思ったのですがいかがですか?

投稿日時 - 2005-06-06 00:25:38

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

質問内容や、書かれているプログラムの処理の流れがつかみきれていないので、
ちょっとトンチンカンなことを書くかもしれません。
すみません。


書かれているSELECT文ですが、このままの形で実行しているとすると、
SELECT句の各項目をどのテーブルから取得するか書いていないので、
複数のテーブルに、同じ項目名が存在すれば、エラーになるかなあと思いました。
(aテーブルにも、bテーブルにも「id」という項目がある場合とか)
あと、結合条件がないのも違和感を感じましたが・・・。
私が勝手に想像しているSELECT文は、例えばこういう感じなのですが、
--------------------------------------------------
SELECT a.id, a.name, b.kana, c.tensu FROM a, b, c
WHERE a.id = b.id
AND a.id = c.id
ORDER BY c.tensu
--------------------------------------------------
(データベースがどうなってるか分からないので、当てずっぽうです)


ここまでは置いといて、補足をいただけませんか?というのが本題です。

同じデータばかり表示されるということですが、
以下の情報があると、何か回答ができるかもしれません。
(自信はないですが・・・)
(1)データベースから値を取得しているところ
(2)「表示」の部分(echo $xxx;とか、print_r($xxx);とか?)
(3)使っているデータベース(mySQLとか、postgreSQLとか)

多分、私の知識不足・理解力不足が原因なのですが、
書かれている情報だけだとピンとこないので、補足をいただけるとありがたいです。
他の方が回答されて、それで無事に問題解決となれば必要ないですが。


質問の本題から外れてしまいますが、
配列を単純にソートしたいということであれば、
sort()関数とか、rsort()関数とか使った方が、楽かなあとは思ったのですが・・。

投稿日時 - 2005-06-05 23:22:26

あなたにオススメの質問