1

多くのチェックボックス、ラジオ、選択リスト変数などを含む、絶えず変化するフォームコンテンツを通じて送信された値に基づいて入力されるテーブルがいくつかあるデータベースがあります...

フォームの各要素には、Q1、Q2、Q3 などの一意の ID が添付されています。ユーザーが情報をチェックしたものは何でも、データベースに追加されます。

情報が挿入される「送信」テーブルは次のようになります。

doc_id  ques   ans          other   final  
1       Q1     1            blah    1
1       Q2     5                    1
1       Q2     6                    1
3       Q3     1            blah   
4       Q4     8
1       Q6     1375228800           1

ユーザーが Q1 を 1 に設定し、Q2 を 5 に設定してすべてのドキュメントを取得したい場合は機能しますが、日付が指定されている場合は機能しません。

検索条件はその場で変更できます。「ans」フィールドに「1375228800」の Unix タイムスタンプが表示されるなど、タイムスタンプで結果をフィルタリングしようとする場合を除いて、ほとんどの場合は機能します。

次に例を示します。

SELECT doc_id FROM submission
WHERE (ques IN ('Q1') AND ans IN ('1'))
AND (ques IN ('Q2') AND ans IN ('5'))
AND (ques = 'Q6' AND ans >= '0' AND ans <= '1375228800')
AND final = '1' 
GROUP BY doc_id

タイムスタンプ部分を追加する場合を除いて機能します...この場合、Q6の値は1375228800です。

これを機能させる最良の方法は何ですか?

4

1 に答える 1

0

変更が必要なクエリがいくつかあります。

まず、単一の値と比較する場合、IN 句を使用する理由はありません。だからあなたを変えてください

ques IN ('Q1')

ques = 'Q1'

同様のインスタンスについても同様です。

次に、タイムスタンプを文字列ではなく整数として保存していると思います。したがって、タイムスタンプを引用符で囲んではなりません。これは、文字列の比較を意味します。代わりに、単に次のように書くことができます。

ans >= 0 AND ans <= 1375228800

または、 BETWEEN演算子を使用できます

ans BETWEEN 0 and 1375228800

最後に、「AND」の英語での理解とプログラムでの理解を混同しています。あなたが言うなら、

(ques IN ('Q1') AND ans IN ('1'))
AND (ques IN ('Q2') AND ans IN ('5'))

ques が同時に Q1 と Q2 の両方であることを要求していますが、明らかに不可能です。代わりに、「OR」句を使用する必要があります。これを考えると、クエリは次のように書き直すことができます

SELECT doc_id FROM submission
WHERE ((ques = 'Q1' AND ans = 1)
    OR (ques = 'Q2' AND ans = '5')
    OR (ques = 'Q6' AND ans BETWEEN 0 AND 1375228800))
    AND final = 1 
GROUP BY doc_id

これにより、次のすべての送信が選択されます。

  • 問題は Q1、答えは 1、最終は 1
  • 問題は Q2、答えは 5、最終は 1
  • 問題は Q6 で、答えは 0 から 1375228800 の間で、最終は 1 です。
于 2013-07-20T05:18:08.567 に答える