アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になっております。
以下のような構成のテーブルがあり

id  type  name
1    1  データベース
2  1001  MySQL
3  1002  PostgreSQL
4  1003  Oracle
5    2  パソコン
6  2001  富士通
7  2002  NEC
8    3  車
9  3001  トヨタ
10 3002  日産
11 3003  ホンダ

typeが1桁のものは、大カテゴリ。
4桁のものは小カテゴリとして、4桁目と大カテゴリの数値を比較して一致した物をそのグループの小カテゴリとしています。

※idはauto_incrementですが、この例は分かり容易くカテゴリ毎に並べていますが、カテゴリの追加を考えた場合、カテゴリの並び順もバラバラになります。

これらデータを呼び出す際、以下のようにしたいのですが(スクリプトはPHPで記述しています)、どのようなSQL文が適切なのでしょうか。

データベース
  MySQL
  PostgreSQL
  Oracle
パソコン
  富士通
  NEC

  トヨタ
  日産
  ホンダ

以上、お恥ずかしいことかもしれませんが、上記のように振り分けるには、一度、

大カテゴリになる部分だけど抽出・変数格納
→再度データ呼び出し・・

などのようなことまで考えている次第です。
お忙しいなか恐縮ですがアドバイスのほど頂戴出来れば幸いです。
(ローカル上ではMySQL4を使っていますが、ウェブサーバーは5なので共に使えるようなものが形が望ましいです)

A 回答 (4件)

きちんと検証できていませんが、こんな感じでやってみては



$sql=<<<eof
select big.name as bigname,small.name as smallname
from big
inner join small on big.id=small.id
order by big.id,small category_no
eof;

$res=mysql_query($sql);
$bigname="";
print "<dl>\n";
while($row = mysql_fetch_array($res,MYSQL_ASSOC)){
if($bigname!=$row["bigname"]){
print "<dt>{$row["bigname"]}\n";
}
print "<dd>{$row["smallname"]}\n";
$bigname=$row["bigname"];
}
print "</dl>\n";
    • good
    • 0
この回答へのお礼

yambejp様

お世話になっております。
出来ました!SQLだけでなく、出力方法までアドバイスいただき、
大きなヒントを得たようです。ありがとうございました!

お礼日時:2010/03/08 15:44

大分類、小分類と言う2個のクエリから得られるデータを


縦に並べれば良いようです。
(1)大分類
SELECT type AS dai,0 AS sho,name
 FROM hoge WHERE type<10
(2)小分類
SELECT FLOOR(type/1000) AS dai,MOD(type,1000) AS sho,name
 FROM hoge WHERE type>=1000

これを繋げましょう。

SELECT type AS dai,0 AS sho,name
 FROM hoge WHERE type<10
UNION ALL
SELECT FLOOR(type/1000) AS dai,MOD(type,1000) AS sho,name
 FROM hoge WHERE type>=1000
ORDER BY dai,sho
    • good
    • 0

DBの構造がよくないですね。


もし命題がただしいなら大カテゴリは最大10個(0を抜かせば9個)
しか登録できませんがよろしいのですか?

また、リレーションする条件も不明確で、このままやっても
パフォーマンスがでにくい構造ですし、高い確率で破たんすると
思いますよ
正規化についていちどしっかり学習なさるとよいかと思います
    • good
    • 0
この回答へのお礼

yambejp様

ご親切な対応をありがとうございます。

>もし命題がただしいなら大カテゴリは最大10個(0を抜かせば9個)
>しか登録できませんがよろしいのですか?

ご指摘の通りです!そこまで考慮できていませんでした。(お恥ずかしい)

で、改めて構造を考えてみたのですが、以下のような構造では如何でしょうか?アドバイス頂けると幸いです。

id   name
1   データベース
2   パソコン
3   車

※idで紐付けている。

no id category_no name
1  1  1001    MySQL
2  1  1002    PostgreSQL
3  1  1003    Oracle
4  2  2001    富士通
5  2  2002    NEC
6  3  3001    トヨタ
7  3  3002    日産
8  3  3003    ホンダ

お礼日時:2010/03/08 11:53

type列のデータ型は、何ですか?



>ローカル上ではMySQL4を使って

MySQL4といった表記はやめ、もっと具体的に提示してください。
MySQL 4.0までと4.1以降では、サブクエリの使用可否など機能がまったく異なります。

この回答への補足

chukenkenkou様

こんにちは。早速の対応をありがとうございます。
データ型はvarcharで、MySQLのローカルのバージョンは4.1、ウェブサーバー側のバージョンは5.1です。
すみません。情報不足でした。

補足日時:2010/03/08 11:45
    • good
    • 0

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

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