はじめての親子ハイキングに挑戦!! >>

このスレでいいのかちょとわからなかったのですが、
SQLの書き方のなのでこちらで質問をさせて頂きます。

(VB.NET)

□ A □ B □ C

チェックボックス(A,B,C)があります。

例えば(A、B,C)どれか一つ選択された場合
SELECT文でテーブルA、B、Cからデータを抽出するイメージは
わくのですが、チェックボックスで(A、C)など複数
選択された場合には、SELECT文でテーブルAを抽出し
終わった後、SELECT文でテーブルCを抽出するのは
問題があるのではないかと思います。

ただイメージがわきません…。ヒントでもいいので
もしよろしければアドバイスよろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

>チェックボックスで(A、C)など複数


>選択された場合には、SELECT文でテーブルAを抽出し
>終わった後、SELECT文でテーブルCを抽出するのは
>問題があるのではないかと思います。

危惧している問題が解りません。
例えば、抽出するSQL投入のタイムラグを問題にしているのか?
または、抽出するプログラムのコーディング量が増えるのを気にしているのか?
問題があるのではないかと思うなら、それを明示しないと、問題があるのかないのか、
仮に問題があるなら、その問題の解消法が提示できません。

例えば、で書いた2点のような話であれば、問い合わせ結果を一つに纏めて良いなら・・
select * from A where Aが真なら
union all
select * from B where Bが真なら
union all
select * from C where Cが真なら
;
のようなSQLで、複数のテーブルを纏めて検索すればOKかと思います。
(各テーブルの構成が違っても、問い合わせ結果が同じなら、UNION-ALL出来ます)
    • good
    • 0
この回答へのお礼

メッセージありがとうございます。
少しまとめた上でもう一度質問をさせて頂きます。

お礼日時:2007/11/28 22:13

A、B、C


全て同じテーブルレイアウトなのでしょうか?
だとすれば、 FROM句で
SELECT (任意のカラム) FROM A , C WHERE 何とかかんとか~
でいけるんじゃ?

実装させたい機能がわからないのでなんともいえませんが、 A、B、C 全て同じテーブルレイアウトである必要性を感じないので。もしかしたら的外れな回答かもしれません

何れにせよ、どんな機能なのか、どのような保存をさせているのかわからないので 的確な回答が出来ません。

この回答への補足

メッセージありがとうございます。
説明不足ですいません…。
全て同じレイアウトではありません。なのでUNIONを使わないと
厳しいのかなと思っています。

補足日時:2007/11/28 21:53
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qチェックボックスによる検索

こんばんは。お世話になっております。
PHPにてDB(MySQL)に登録されたデータをチェックボックスのみで検索するスクリプトを組んでおりますが、チェックボックスの数が多数あり、混乱してしまい、お力をお借りしたく投函させて頂きました。
上手く説明できるかどうか判りませんが…

まず検索項目として、(複数チェック可)
カテゴリ: □ドリンク □グルメ □ケーキ
年齢:   □20代  □30代

以上のようなフォームを用意しており、各チェックボックスのnameはDBのフィールドを同じ名前。valueは実際に登録されている数値を記述しています。

そこで、上記チェックボックスにいくつかのチェックを入れ、検索すると、それに該当するものだけを検索結果として一覧表示させたいのですが、現在、全ての項目に当てはまるものと一緒に、1つでも含んだデータまでもが表示されてしまいます。

お忙しい中恐縮ですが、お知恵を頂戴出来ればと考えております。
宜しくお願い致します。

//POSTで受け取ったデータを配列にし、
foreach($arr as $category){
$wherearr1[] = " ( category = '$category' )" }
foreach($arr as $category){
$wherearr2[] = " ( age = '$age' )" }

$wherestr1 = implode(" OR ",$wherearr1);
$wherestr2 = implode(" OR ",$wherearr2);
$sql = "select * from member where $wherestr AND $wherestr1 order by date desc";

$result = mysql_query($sql);

こんばんは。お世話になっております。
PHPにてDB(MySQL)に登録されたデータをチェックボックスのみで検索するスクリプトを組んでおりますが、チェックボックスの数が多数あり、混乱してしまい、お力をお借りしたく投函させて頂きました。
上手く説明できるかどうか判りませんが…

まず検索項目として、(複数チェック可)
カテゴリ: □ドリンク □グルメ □ケーキ
年齢:   □20代  □30代

以上のようなフォームを用意しており、各チェックボックスのnameはDBのフィールドを同じ名前。valueは実...続きを読む

Aベストアンサー

どっちもチェックされていることが前提で。

<form>
<b>カテゴリ</b><br>
<input type="checkbox" name="cate[]" value="1">ドリンク<br>
<input type="checkbox" name="cate[]" value="2">グルメ<br>
<input type="checkbox" name="cate[]" value="3">ケーキ<br>
<br>
<b>年齢</b><br>
<input type="checkbox" name="age[]" value="10">10代<br>
<input type="checkbox" name="age[]" value="20">20代<br>
<br>
<input type="submit">
<input type="hidden" name="aaa" value="aaa">
</form>



<?PHP

$arr1 = array();
foreach($_GET['cate'] as $cate){
$arr1[] = " category = '$cate' ";
}
$arr2 = array();
foreach($_GET['age'] as $age){
$arr2[] = " age = '$age' ";
}

$a = implode(" OR ",$arr1);
$b = implode(" OR ",$arr2);
$sql = "select * from member where ($a) AND ($b) order by date desc";

print $sql;

?>

修正してみて思ったのですが、二つとも「$arr as $category」だったり、
使用された形跡がない変数「 $wherestr 」が使われていたりします。
あとは、
$a = implode(",",$_GET['cate']);
として、 category in ($a) とかやってみたりしてもいいでしょう。

<?PHP

$a = implode(",",$_GET['cate']);
$b = implode(",",$_GET['age']);
$sql = "select * from member where category in ($a) AND age in ($b) order by date desc";

print $sql;

?>

どっちもチェックされていることが前提で。

<form>
<b>カテゴリ</b><br>
<input type="checkbox" name="cate[]" value="1">ドリンク<br>
<input type="checkbox" name="cate[]" value="2">グルメ<br>
<input type="checkbox" name="cate[]" value="3">ケーキ<br>
<br>
<b>年齢</b><br>
<input type="checkbox" name="age[]" value="10">10代<br>
<input type="checkbox" name="age[]" value="20">20代<br>
<br>
<input type="submit">
<input type="hidden" name="aaa" value="aaa">
</form>


...続きを読む

Qチェックボックスから複数のvalueを取り出す

HTMLフォームから、action="file.php"でデータの受け渡し→PHPで送られてきたvalueに応じて文章を出力、というプログラムを作っています。

例:
グループAのラジオボタン1にチェック、送信
→グループAで押されたラジオボタンを送信されたvalueで判別、この場合はvalue==A
→value==Aの場合に表示する文章を変数に受け渡し、その変数で表示

ラジオボタン、テキストボックスのvalueは$_POST['XXX']で取り出せたのですが、チェックボックスのデータだけが取り出せません。こちらの質問を検索したとき、多次元配列という言葉を見かけたのですが、いまいちよく分かりませんでした。
チェックボックスの複数のvalueで、上記の例のような動きを実現させるにはどうしたらいいでしょうか。どなたかご教授ください。

Aベストアンサー

チェックボックスはちょっと特殊

まずHTML部分で、以下のように定義します
<input type="checkbox" name="sample[]" value="test1">test1
<input type="checkbox" name="sample[]" value="test2">test2

ここでは、nameの部分に[]をつけるのがポイント


次にphpで受け取る方法として、
$sample = $_POST["sample"];
で問題ありません。

受け取ったデータを使うときは、$sampleは配列になっていますので、
仮に上記のtest1とtest2両方にチェックが付いているとしたら、
$sample[0]にはtest1が、$sample[1]にはtest2が入っています。

$sampleをforeachで使うか、$sampleのデータ数を調べてforでループさせるなどで使えます。

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

Qチェックボックスの値に応じてPHP内でSQLを発行する方法

HTML検索フォームにチェックボックスを複数設け、チェックが入ったら
チェックされているもの同士をORで結んだものを、他の検索キーとANDで結ぶ
SQL文を発行したいのですが。
これを効率的に行う方法を、以前に本掲示板でご教示いただきました。

<input type="checkbox" name="food[]" value="1">果物
<input type="checkbox" name="food[]" value="2">野菜
<input type="checkbox" name="food[]" value="3">肉類

if(is_array($_POST['food'])) {
$sql .= " AND (";
$i=0; # 「or」 をつけるフラグ
foreach($_POST['food'] AS $food_code) {
if ($i) {
$sql .= " OR ";
}
$sql .= "MYTABLE.MYFOOD = '$food_code'";
$i++;
}
$sql .=")";
}

これを応用し、MySQLのMYTABLE.MYFOODに次のようなレコードが登録されているとして、

果物―みかん
野菜〔にんじん〕
野菜(キャベツ)
肉類【豚バラ】
果物~りんご
 :

これら先頭2文字を切り出して(あるいは「LIKE '肉類%'」のように、~で始まる、
でもいいです)真偽を評価したいです。

その際、果物と肉類にチェックが入ったと仮定して
AND (SUBSTRING(MYTABLE.MYFOOD,1,4) = '果物' OR SUBSTRING(MYTABLE.MYFOOD,1,4) = '肉類')
としてみたら、合致するものだけをうまく抽出できたのですが、
このようなロジックを冒頭のPHPコードに組み込むにはどう書いたらいいでしょうか?

なお、果物5種類、野菜3種類、肉類7種類と、いずれも有限ですので、
SQL文をベタ書きすることは十分可能だと思っています。

HTML検索フォームにチェックボックスを複数設け、チェックが入ったら
チェックされているもの同士をORで結んだものを、他の検索キーとANDで結ぶ
SQL文を発行したいのですが。
これを効率的に行う方法を、以前に本掲示板でご教示いただきました。

<input type="checkbox" name="food[]" value="1">果物
<input type="checkbox" name="food[]" value="2">野菜
<input type="checkbox" name="food[]" value="3">肉類

if(is_array($_POST['food'])) {
$sql .= " AND (";
$i=0; # 「or」 をつけるフラグ
...続きを読む

Aベストアンサー

果物や肉類を種別テーブルとして別に作った方がいいような気がするのは置いといて。

例です。

<input type="checkbox" name="food[]" value="果物">
<input type="checkbox" name="food[]" value="野菜">
<input type="checkbox" name="food[]" value="肉類">

として、

$sql .= "(SUBSTRING(MYTABLE.MYFOOD,1,4) = '";
$sql .= implode ("' OR SUBSTRING(MYTABLE.MYFOOD,1,4) = '",$_POST['food']);
$sql .= ")";

と、こんな感じなのかなと思う次第ですがいかがでしょう。

参考URL:http://php.s3.to/man/function.implode.html

Q日付型カラムへのデータINSERT

お世話になります。ひとつご教授ください。

オラクル10g, ojdbc14でjdk1.4.2から接続です。

INSERT命令を使ってテーブルにレコードを追加する際に、DATE型のカラムに対して

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27 12:00:00', ...);

を実行するとエラーORA-01861が出ます。そこで

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27', ...);

このように記述して再度実行すると通ります。

このようなとき、時間の部分まで設定した値をカラムに格納したいときはどうしたらよろしいでしょうか?

よろしくお願いします。

Aベストアンサー

ごめんなさい。
説明と文例が違ってしまいました。
正しくはこちらです。

INSERT TABLE_A (DATE1, ...) VALUES (to_date('2006-4-27 12:00:00','yyyy/mm/dd hh24:mi:ss'), ...);
というように、to_date関数を使うのが一般的かと思います。

QForm間の値の渡し方

1つのForm上のコマンドボタンで別のFormを表示、そこで変数に値を入れ、そのFormを閉じ、元のFormでその変数を使いたいのですが、どうもうまくいきません。
実施したやり方は、一方のFormの宣言領域で、”Public abc As String”を宣言、両方のFormの(変数に値を入れた方と変数を使う方の)プロシージャーの宣言では引数として(abc As String)と記述しました。
因みに、両プロシージャーともイベントプロシージャーです。何か基本的なことができていないのだとは思いますが、どなたか教えていただけませんか?よろしくお願いします。

Aベストアンサー

すでに何件か回答があがっていますので、少し変わった方法をご参考までに。

あまり使われませんが、Formにはtagというプロパティがあります。
これは「文字列形式であれば何でも格納できる」という、上手く使えば便利なプロパティです。

FormAからFormBを呼び出し、FormBで変更した値をFormA.tagにセットします。
ここでFormBをUnloadしてもFormA.tagの値は影響を受けないので自由に使えます。

複数の値を呼び出し元に戻してやる場合に、区切り文字(カンマなど)で連結した文字列をtagに格納し、呼び出し元で区切り文字でsplitして、複数の値を受け渡すという手法をよく使っています。

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

Qselect文のwhere句に配列を入れて検索したいのです。

はじめまして。php5とpostgresを使って、ブラウザで都道府県をセレクトで複数選択(prefecture[])して、postgresに
select city from city_table where p_id='prefecture';
としているのですが、結果を出力できません。

print_rで見たところprefectureに複数選択した都道府県のidが配列として入っていることは確認しております。

where句に配列を入れて検索するにはどうすれば良いのでしょうか?
よろしくお願いいたします。

Aベストアンサー

WHERE句の書き方が違うと思います。
複数の条件であれば = ではなく、IN を使います。
  WHERE p_id IN (条件1, 条件2, …)

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング