0

特定のプレフィックスを持つ入力済みフィールドの数を数えることは可能ですか?

たとえば、複数の選択肢がある Q&A の表があります。質問には 3 つの回答オプションがある場合もあれば、4 つまたは 5 つの回答オプションがある場合もあります。各回答はanswer1_aanswer1_banswer1_c、 などのフィールドにあります。これらのフィールドのうちいくつのフィールドに (特定のレコードに対して) データがあるかを特定する方法はありますか? HTML に表示する多肢選択オプションの数を決定するために、これが必要です。

おそらく何らかの方法でmysql_num_fieldsを使用していますか?

ありがとう、ジェフ

4

2 に答える 2

2

テーブル構造を考えると、カイの答えは正しいです。

将来的には、次のような実際のリレーショナル モデルを使用することをお勧めします。

CREATE TABLE QUESTION(
  ID INTEGER NOT NULL,
  QUESTION VARCHAR(100) NOT NULL,

  PRIMARY KEY (ID)
);

INSERT INTO QUESTION VALUES(1, 'My first question');
INSERT INTO QUESTION VALUES(2, 'My second question');
INSERT INTO QUESTION VALUES(3, 'My third question');

CREATE TABLE ANSWER(
  ID INTEGER NOT NULL,
  ID_QUESTION INTEGER NOT NULL,
  ANSWER VARCHAR(100) NOT NULL,

  PRIMARY KEY (ID),
  FOREIGN KEY (ID_QUESTION) REFERENCES QUESTION(ID)
);

INSERT INTO ANSWER VALUES (1, 1, 'First possible answer for question 1');
INSERT INTO ANSWER VALUES (2, 1, 'Second possible answer for question 1');
INSERT INTO ANSWER VALUES (3, 1, 'Third possible answer for question 1');
INSERT INTO ANSWER VALUES (4, 2, 'First possible answer for question 2');
INSERT INTO ANSWER VALUES (5, 2, 'Second possible answer for question 2');
INSERT INTO ANSWER VALUES (6, 3, 'First possible answer for question 3');
INSERT INTO ANSWER VALUES (7, 3, 'Second possible answer for question 3');
INSERT INTO ANSWER VALUES (8, 3, 'Third possible answer for question 3');
INSERT INTO ANSWER VALUES (9, 3, 'Fourth possible answer for question 3');

SELECT
  QUESTION.ID,
  COUNT(*) as NB_ANSWER
FROM QUESTION
INNER JOIN ANSWER ON QUESTION.ID = ANSWER.ID_QUESTION
GROUP BY QUESTION.ID
ORDER BY QUESTION.ID;

ここで動作することを確認してください:http://sqlfiddle.com/#!3/0025a/3/0

于 2012-06-15T07:18:59.013 に答える
1

SQLでこれを解決するには、すべてのフィールド名を明示的にリストする必要があります。NULLデータが指定されていないときにフィールド値がに設定されているとすると、SQLソリューションは次のようになります。

SELECT *, 
    ( answer1_a IS NOT NULL +
      answer1_b IS NOT NULL +
      answer1_c IS NOT NULL +
      answer1_d IS NOT NULL +
      answer1_e IS NOT NULL ) AS number_of_answers
FROM answers

スケーラブルなアプローチ(たとえば、新しい回答「f」を挿入するためにテーブル構造を変更すると自動的に大きくなります)は、PHPでこの種の計算を行うことです。

<?php
$res = mysql_query("SELECT * FROM answers");
while ( $row = mysql_fetch_assoc($res) ) {
    $count = 0;
    foreach ( $row as $fieldname => $value ) {
        if ( strncmp($fieldname, 'answer1_', 8) === 0 &&
             $value !== NULL ) {
            $count++;
        }
    }
    $row['number_of_answers'] = $count;
    $resultset[] = $row;
}
print_r($resultset);

HAVINGただし、PHPソリューションには、ステートメントでorWHERE句を簡単に使用SELECTして、4つの可能な回答があるすべての質問を(たとえば)見つけることができないという欠点があります。

于 2012-06-15T06:25:27.297 に答える