Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/MySQL-计算具有给定前缀的字段数_Php_Mysql - Fatal编程技术网

PHP/MySQL-计算具有给定前缀的字段数

PHP/MySQL-计算具有给定前缀的字段数,php,mysql,Php,Mysql,是否可以计算具有给定前缀的已填充字段的数量 e、 g.我有一张问答表,上面有多项选择答案。有时一个问题有3个答案选项,有时有4或5个。每个答案都在一个字段中,如answer1\u a,answer1\u b,answer1\u c,等等,是否有办法确定这些字段中有多少字段具有数据(对于给定记录)?我需要这个来确定HTML中要显示多少个多选选项 也许以某种方式使用mysql\u num\u字段 谢谢, Geoff要在SQL中解决这个问题,必须明确列出所有字段名。。假设在未提供数据时字段值设置为NU

是否可以计算具有给定前缀的已填充字段的数量

e、 g.我有一张问答表,上面有多项选择答案。有时一个问题有3个答案选项,有时有4或5个。每个答案都在一个字段中,如
answer1\u a
answer1\u b
answer1\u c
,等等,是否有办法确定这些字段中有多少字段具有数据(对于给定记录)?我需要这个来确定HTML中要显示多少个多选选项

也许以某种方式使用mysql\u num\u字段

谢谢,
Geoff要在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
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;
一种可扩展的方法(当您更改表结构时会自动增长,例如插入一个新的答案“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);

要在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
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;
一种可扩展的方法(当您更改表结构时会自动增长,例如插入一个新的答案“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);

鉴于您的表结构,Kaii的答案是正确的

对于未来,我建议使用如下真正的关系模型:

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
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;

在这里查看它的工作情况:

鉴于您的表结构,Kaii的答案是正确的

对于未来,我建议使用如下真正的关系模型:

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
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;

请在此处查看它的工作情况:

使用循环。无论哪种方式,您都需要获取此字段的值,对吗?检查循环,如果为null或为空,则不显示它。是否可以发布表结构?使用循环。无论哪种方式,您都需要获取此字段的值,对吗?检查循环,如果为null或为空,则不显示。可以发布表结构吗?我认为您不需要
SUM()
,如果每行都是唯一的问题,只需将它们添加在一起就可以了。我认为您不需要
SUM()
,如果每一行都是一个唯一的问题,仅仅把它们加在一起就可以了。+1-我还可以建议
ALTER TABLE answer ADD COLUMN sequence INT NOT NULL;更改表格答案添加唯一性(id_问题,顺序)(语法不正确,但你明白了)。+1-我还可以建议
改变表格答案添加列序列INT not NULL;更改表格答案添加唯一性(id_问题,顺序)(语法不正确,但你明白了)。