Jump to content
Fórum Script Brasil
  • 0

Agrupar resultados iguais (de diversas colunas) de um único registro


Andy_pts
 Share

Question

Boa noite, pessoal! Estou com uma dúvida terrível! Tenho uma Pesquisa de Satisfação / Interesses com mais de 50 perguntas, onde cada pessoa consultada pode responder: Péssimo, Ruim, Normal, Bom ou Ótimo e essas respostas são gravadas no BD em campos int(1) os valores: 0,1,2,3 e 4 respectivamente às respostas já citadas.

 

Tenho a tabela “pesquisa” abaixo (para exemplo coloquei só algumas colunas, mas têm mais de 50 colunas - perguntas):

 

id | Cliente | p1 | p2 | p3 | p4 | p5 | p6 | p7 | p8 | p9 | p10 | p11 | p12 | p13 | p14 | p15| ... | p50

1  | Fulano |  0  |  0  |  3  |  4  |  2  |  2  |  1  |  1  |  4  |   0   |   1   |   4   |   4   |   4   |   1  | ... |   4

 

 

Daí preciso consultar para quais Perguntas “Fulano” respondeu cada uma das notas que forem citadas (de 0 a 4), e ter um retorno conforme abaixo:

 

Nome do consultado: Fulano

 

Respostas:

 

Péssimo:

Pergunta1, Pergunta2, Pergunta10, etc...

 

Ruim:

Pergunta7, Pergunta8, Pergunta11, Pergunta15, etc..

 

Normal:

Pergunta5, Pergunta6, etc...

 

Bom:

Pergunta1, Pergunta2, Pergunta10, etc...

 

Ótimo:

Pergunta4, Pergunta9, Pergunta12, Pergunta13, Pergunta14, Pergunta50, etc...

 

 

Ou seja, “Fulano” respondeu:

 

0 para Pergunta1, Pergunta2, Pergunta10, etc...

1 para Pergunta7, Pergunta8, Pergunta11, Pergunta15, etc..

2 para Pergunta5, Pergunta6, etc...

3 para Pergunta3, etc...

4 para Pergunta4, Pergunta9, Pergunta12, Pergunta13, Pergunta14, Pergunta50, etc...

 

OBS.: Caso alguma das opções de resposta não tenha sido citada (respondida) ela não pode aparecer. Por exemplo: se nenhuma pergunta foi respondida com "2", a palavra "Normal:" não deve aparece na listagem acima.

 

 

Como faço para ter este tipo de retorno com um monte de colunas e cada usuário com uma linha de registro somente? Parece simples, a princípio, mas não estou encontrando uma forma de manipular os dados da consulta para conseguir o retorno desejado acima...

 

Para consultar estou usando:

 

$query = mysqli_query($mysqli, "SELECT * FROM pesquisa WHERE id = '1' LIMIT 1");

$nlinhas = mysqli_num_rows($query);

 

if ($nlinhas > 0) {

 

$dados = mysqli_fetch_array($query);

 

$id= $dados['id'];

 

$cliente = $dados['Cliente'];

 

$p1= $dados['p1'];

$p2= $dados['p2'];

$p3= $dados['p3'];

$p4= $dados['p4'];

$p5= $dados['p5'];

 

E assim por diante...

 

}

 

 

Alguém pode me ajudar?

Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 0

Olá!

Segue sugestão para solução:

SQL de exemplo:

-- remover banco de dados se ele existir
DROP SCHEMA IF EXISTS scriptbrasil;
-- criar banco de dados
CREATE SCHEMA scriptbrasil;
-- usar o banco de dados
USE scriptbrasil;

--
-- PESQUISA
--

CREATE TABLE pesquisa (
  id int(11) primary key auto_increment NOT NULL,
  cliente varchar(20) NOT NULL,
  p1 tinyint(1),
  p2 tinyint(1),
  p3 tinyint(1),
  p4 tinyint(1),
  p5 tinyint(1),
  p6 tinyint(1),
  p7 tinyint(1),
  p8 tinyint(1),
  p9 tinyint(1),
  p10 tinyint(1),
  p11 tinyint(1),
  p12 tinyint(1),
  p13 tinyint(1),
  p14 tinyint(1),
  p15 tinyint(1)
) ENGINE=InnoDB;

--
-- Dumping data for table PESQUISA
--

INSERT INTO pesquisa (cliente,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15) VALUES
('João Primeiro',0,0,3,4,2,2,1,1,4,0,1,4,4,4,1),
('Maria Segunda',3,3,3,4,2,2,1,1,4,0,1,4,4,4,1),
('Fernando Terceiro',4,2,2,1,1,4,0,1,4,4,4,1,3,3,3),
('Juliana Quarta',1,4,0,1,4,0,0,0,2,2,4,1,3,3,3);

Arquivo para conexão com o banco de dados:

<?php

// arquivo para conexão com o mysql
// definição de variáveis para conexão
$host = 'localhost'; // endereço do banco
$user = 'root'; // usuário
$pass = '';  // senha
$database = 'scriptbrasil'; // nome do banco de dados

// estabelecer conexão:
$sqli = new mysqli($host, $user, $pass);

// verificando se conectou de boas:
if ($sqli->connect_error) {
    // se houver alguma falha, exibe mensagem:
    echo '<p class="error">Falha na conexão: ' . $sqli->connect_error . '</p>';
}

// definir o padrão de caracteres
if (!$sqli->set_charset('utf8')) {
    // se não conseguir definir o padrão de caracteres, exibe o padrão disponível
    echo "<p class='error'>Seu charset não é utf8, chefe!<br>$sqli->character_set_name()</p>";
}

// selecionar/abrir o banco de dados para trabalhar
if (!$sqli->select_db($database)) {
    // se o banco de dados não for encontrado
    echo "<p class='error'>Banco de dados não encontrado, chefe!</p>";
}

Arquivo para consulta e exibição dos dados:

<?php
                // inclui arquivo de conexão com o mysql
                include 'connect.php';
                // opções de repostas
                $options = ['Péssimo', 'Ruim', 'Normal', 'Bom', 'Ótimo'];
                // busca tudo da pesquisa
                $result = $sqli->query('SELECT * FROM pesquisa');
                if ($sqli->error) {
                    // se houver erro, exibe o erro na tela:
                    die('<p class="error">Falha ao efetuar busca:<br> ' . $sqli->error . '</p>');
                }
                $dados = $result->fetch_all(MYSQLI_ASSOC);
                // inicia a variável que conterá os dados organizados
                $organized = [];
                foreach ($dados as $k => $question) {
                    // adiciona os índices id e cliente à variável $organized
                    $organized[$k] = [
                        'id' => $question['id'],
                        'cliente' => $question['cliente'],
                    ];
                    // cria os índices: Péssimo, Ruim, Normal, Bom e Ótimo
                    // para receber quais perguntas foram assim respondidas
                    foreach ($options as $o) {
                        $organized[$k][$o] = [];
                    }
                    // remove os índices id e cliente, deixando apenas as perguntas e respostas no array $question
                    unset($question['id'], $question['cliente']);
                    foreach ($question as $p => $answer) {
                        // agrupa as perguntas de acordo com as respostas
                        array_unshift($organized[$k][$options[$answer]], $p);
                    }
                }
                // exibe array organizado na tela apenas para visualização:
                echo '<pre>'; print_r($organized); echo '</pre>';

Exemplo de como fica a exibição apenas para efeito de visualização na tela:

Array
(
    [0] => Array
        (
            [id] => 1
            [cliente] => João Primeiro
            [Péssimo] => Array
                (
                    [0] => p10
                    [1] => p2
                    [2] => p1
                )

            [Ruim] => Array
                (
                    [0] => p15
                    [1] => p11
                    [2] => p8
                    [3] => p7
                )

            [Normal] => Array
                (
                    [0] => p6
                    [1] => p5
                )

            [Bom] => Array
                (
                    [0] => p3
                )

            [Ótimo] => Array
                (
                    [0] => p14
                    [1] => p13
                    [2] => p12
                    [3] => p9
                    [4] => p4
                )

        )

    [1] => Array
        (
            [id] => 2
            [cliente] => Maria Segunda
            [Péssimo] => Array
                (
                    [0] => p10
                )

            [Ruim] => Array
                (
                    [0] => p15
                    [1] => p11
                    [2] => p8
                    [3] => p7
                )

            [Normal] => Array
                (
                    [0] => p6
                    [1] => p5
                )

            [Bom] => Array
                (
                    [0] => p3
                    [1] => p2
                    [2] => p1
                )

            [Ótimo] => Array
                (
                    [0] => p14
                    [1] => p13
                    [2] => p12
                    [3] => p9
                    [4] => p4
                )

        )
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.6k
    • Total Posts
      646.2k
×
×
  • Create New...