Ir para conteúdo
Fórum Script Brasil
  • 0

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


Andy_pts

Pergunta

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 para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...