Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Maykel-ctba

ORDER BY coluna que vem de subquery, é possível?

Recommended Posts

Bom dia!

Tenho a seguinte query:

SELECT * FROM sistema_cliente c 
INNER JOIN sistema_assinatura_cliente ac ON ac.cliId = c.cliId 
WHERE cliAtivo = 'S' 
AND cliExcluido = 'N' 
AND c.cidId IN (
    SELECT cidId FROM sistema_assinatura_cidade 
    WHERE cidId IN (2878)
) 
AND c.cliId IN (
    SELECT cliId FROM sistema_assinatura a 
    INNER JOIN sistema_assinatura_cliente ac ON ac.assId = a.assID 
    INNER JOIN sistema_assinatura_plano ap ON ap.assId = a.assID
    WHERE ap.aspSituacao = 3
) 
ORDER BY
    CASE
        WHEN 'ap.plaId' is 11 THEN 1
        WHEN 'ap.plaId' is 10 THEN 2
        WHEN 'ap.plaId' is 09 THEN 3
    END
LIMIT 0,15

Estou com problemas ao executar este ORDER By! Não sei se a sintaxe que utilizei é a apropriada. O campo 'ap.plaId' consta na segunda subquery (AND c.cliId IN...).

Isso é possível? Caso não, como posso fazer? Terei que fazer mais uma subquery para o Order By?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma solucão:

 Transforme a subquery em uma tabela virtual ,  trazendo a coluna que se quer , e faça um join , tem a coluna agora para ordenar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, meio nas escuras, não sei se tem erro, mas veja a ideia, se seria possível:
 

SELECT * FROM sistema_cliente c 
INNER JOIN sistema_assinatura_cliente ac ON ac.cliId = c.cliId 
INNER JOIN (
        SELECT cliId, ap.aspSituacao,ap.plaId FROM sistema_assinatura a 
        INNER JOIN sistema_assinatura_cliente ac ON ac.assId = a.assID 
        INNER JOIN sistema_assinatura_plano ap ON ap.assId = a.assID
        WHERE ap.aspSituacao = 3
) ap ON c.cliId = ap.cliId
WHERE cliAtivo = 'S' 
AND cliExcluido = 'N' 
AND c.cidId IN (
    SELECT cidId FROM sistema_assinatura_cidade 
    WHERE cidId IN (2878)
) 
ORDER BY
    CASE
        WHEN 'plaId' is 11 THEN 1
        WHEN 'plaId' is 10 THEN 2
        WHEN 'plaId' is 09 THEN 3
    END
LIMIT 0,15

Atualização: Fiz uma alteração

Compartilhar este post


Link para o post
Compartilhar em outros sites

@EdCesar, obrigado pela dica!

 

Infelizmente deu Syntax Error... até tentei botar aspas para ver se era este o problema... mas deu na mesma.

 

Citar

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''11' THEN 1 WHEN 'plaId' is '10' THEN 2 WHEN 'plaId' is '09' T' at line 17 )

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 minuto atrás, Maykel-ctba disse:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''11' THEN 1 WHEN 'plaId' is '10' THEN 2 WHEN 'plaId' is '09' T' at line 17 )


Esqueci o campo plaId, atualizei a query com ele, da uma olhada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado @EdCesar pela atenção!

 

Ainda ocorre o erro. Tentei também trocar a instrução IS por =, mas o erro ainda é o mesmo. Também tentei inserir um CASE para cada caso do order (vi assim em alguns exemplos), mas também ocorre a mesma coisa...

 

Usando seu exemplo:

SELECT * FROM sistema_cliente c 
INNER JOIN sistema_assinatura_cliente ac ON ac.cliId = c.cliId 
INNER JOIN (
        SELECT cliId, ap.aspSituacao,ap.plaId FROM sistema_assinatura a 
        INNER JOIN sistema_assinatura_cliente ac ON ac.assId = a.assID 
        INNER JOIN sistema_assinatura_plano ap ON ap.assId = a.assID
        WHERE ap.aspSituacao = 3
) ap ON c.cliId = ap.cliId
WHERE cliAtivo = 'S' 
AND cliExcluido = 'N' 
AND c.cidId IN (
    SELECT cidId FROM sistema_assinatura_cidade 
    WHERE cidId IN (2878)
) 
ORDER BY
    CASE
        WHEN 'plaId' is 11 THEN 1
    CASE
        WHEN 'plaId' is 10 THEN 2
    CASE
        WHEN 'plaId' is 09 THEN 3
    END
Citar

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CASE WHEN plaId = '10' THEN 2
    CASE WHEN plaId = '09' THEN 3
    END
LIMIT' at line 17 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma coisa que reparei é que se eu tirar o Order By, roda legal a query (porém, sem ordenar, claro). Mas não está retornando como antes...

Ele está retornando registros repetidos que tem mais de um registro em sistema_assinatura_plano, por causa do segundo INNER JOIN. Não tem como não utilizar este Join? hehe

Compartilhar este post


Link para o post
Compartilhar em outros sites

A ideia do inner join é "simular" a tabela virtual que o @Mota sugeriu. Acredito que o esses são os caminhos...
Só um adendo para a palavra case, que deve ser usada apenas uma vez:

    CASE
        WHEN 'plaId' = 11 THEN 1
        WHEN 'plaId' = 10 THEN 2
        WHEN 'plaId' = 09 THEN 3
    END

Se algo me clarear aqui, dou um retorno. Até lá, boa sorte!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais uma tentativa rs
 

SELECT * FROM sistema_cliente c 
INNER JOIN sistema_assinatura_cliente ac ON ac.cliId = c.cliId 
INNER JOIN (
            SELECT cliId,
            CASE
                WHEN ap.plaId = 11 THEN 1
                WHEN ap.plaId = 10 THEN 2
                WHEN ap.plaId = 09 THEN 3
            END AS novo_plaId
        FROM sistema_assinatura a 
            INNER JOIN sistema_assinatura_cliente ac ON ac.assId = a.assID 
            INNER JOIN sistema_assinatura_plano ap ON ap.assId = a.assID
            WHERE ap.aspSituacao = 3
        ) ap
ON ap.cliId = c.cliId
WHERE cliAtivo = 'S' 
AND cliExcluido = 'N' 
AND c.cidId IN (
    SELECT cidId FROM sistema_assinatura_cidade 
    WHERE cidId IN (2878)
) 
AND c.cliId IN (
    SELECT cliId FROM sistema_assinatura a 
    INNER JOIN sistema_assinatura_cliente ac ON ac.assId = a.assID 
    INNER JOIN sistema_assinatura_plano ap ON ap.assId = a.assID
    WHERE ap.aspSituacao = 3
) 
ORDER BY novo_plaId
LIMIT 0,15

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@EdCesar

 

Retornaram 3 resultados! Deveria resultar 2 (um retornou duplicado, acredito que pelo INNERJOIN). Mas pelo visto, retornou na ordem certa ao menos! Acredito que com um GROUP BY deverá sanar a situação.

 

Mas.... We have a problem now.

 

Além destes 3 CASES, terão outros casos de ORDER BY que ainda não coloquei, que farão buscas em outras tabelas também. Desta maneira com o CASE feito diretamente INNER JOIN, não saberei como colocar as demais condições de ordem, pois elas não tem relação com esta tabela. Caso o ORDER BY ficasse lá por ultimo, fora das subquerys, eu poderia pensar nisso mais a frente, mas como a estrutura da query sugerida é bem diferente, não sei como farei.

 

Vou explicar a necessidade por completo:

 

Este é um sistema de busca de usuários. Neste sistema, a lista de busca deverá listar:

  • Primeiro, os usuários com assinaturas que tem plano GOLD (ID 11 lá do ORDER BY)
  • Depois, usuários com assinaturas SILVER (ID 10)
  • Depois, usuários com assinaturas BRONZE (ID 9)
  • Depois, membros com as maiores avaliações (outra tabela, tabela sistema_avaliacao - que deverá fazer uma média das somas)
  • Depois, ordem alfabética

Desta maneira que vocês sugeriram, será possível fazer algo assim? Ou terei que mexer algo na estrutura da query?

 

Como não conheço nenhum Fiddle de MySQL, segue um dump de exemplo das tabelas (estou enviando apenas o necessário, hehe)

 

CREATE TABLE IF NOT EXISTS `sistema_assinatura` (
  `assId` int(11) NOT NULL,
  `assDataCadastro` datetime NOT NULL,
  `assAtivo` enum('S','N') NOT NULL,
  `assExcluido` enum('S','N') NOT NULL
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

INSERT INTO `sistema_assinatura` (`assId`, `assDataCadastro`, `assAtivo`, `assExcluido`) VALUES
(1, '2017-04-14 22:42:33', 'S', 'N'),
(4, '2017-04-25 21:56:48', 'S', 'N');

CREATE TABLE IF NOT EXISTS `sistema_assinatura_cidade` (
  `ascId` int(11) NOT NULL,
  `assId` int(11) NOT NULL,
  `cidId` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8;

INSERT INTO `sistema_assinatura_cidade` (`ascId`, `assId`, `cidId`) VALUES
(21, 1, 2878),
(22, 1, 3135),
(23, 1, 2806),
(24, 1, 2894),
(25, 1, 2824),
(26, 1, 4549),
(27, 1, 5270),
(28, 4, 2878),
(29, 4, 4549),
(30, 4, 5270),
(31, 4, 4500),
(32, 4, 3135);

CREATE TABLE IF NOT EXISTS `sistema_assinatura_cliente` (
  `ascId` int(11) NOT NULL,
  `assId` int(11) NOT NULL,
  `cliId` int(11) NOT NULL
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

INSERT INTO `sistema_assinatura_cliente` (`ascId`, `assId`, `cliId`) VALUES
(1, 1, 1),
(2, 2, 3),
(3, 3, 4),
(4, 4, 5);

CREATE TABLE IF NOT EXISTS `sistema_assinatura_plano` (
  `aspId` int(11) NOT NULL,
  `aspSituacao` int(1) NOT NULL,
  `aspDataVencimento` int(2) NOT NULL,
  `assId` int(11) NOT NULL,
  `plaId` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

INSERT INTO `sistema_assinatura_plano` (`aspId`, `aspSituacao`, `aspDataVencimento`, `assId`, `plaId`) VALUES
(1, 3, 14, 1, 1),
(2, 3, 14, 1, 9),
(5, 3, 26, 4, 1);

CREATE TABLE IF NOT EXISTS `sistema_avaliacao` (
  `avaId` int(11) NOT NULL,
  `avaVotadoId` int(11) NOT NULL,
  `avaEleitorId` int(11) NOT NULL,
  `avaComentario` varchar(255) NOT NULL,
  `avaNota` enum('1','2','3','4','5') NOT NULL
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

INSERT INTO `sistema_avaliacao` (`avaId`, `avaVotadoId`, `avaEleitorId`, `avaComentario`, `avaNota`) VALUES
(1, 1, 1, 'Teste', '5');

CREATE TABLE IF NOT EXISTS `sistema_cidade` (
  `cidId` int(11) NOT NULL,
  `cidNome` varchar(120) CHARACTER SET latin1 DEFAULT NULL,
  `estId` int(5) DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=5565 DEFAULT CHARSET=utf8;

INSERT INTO `sistema_cidade` (`cidId`, `cidNome`, `estId`) VALUES
(2878, 'Curitiba', 18);

CREATE TABLE IF NOT EXISTS `sistema_cliente` (
  `cliId` int(11) NOT NULL,
  `cliPerfil` enum('C','R') NOT NULL,
  `cliNome` varchar(255) NOT NULL,
  `cliEmail` varchar(255) NOT NULL,
  `cliSenha` varchar(255) NOT NULL,
  `cidId` int(11) NOT NULL,
  `estId` int(11) NOT NULL,
  `cliDataNascimento` date NOT NULL,
  `cliCPF` varchar(255) NOT NULL,
  `cliTelefone` varchar(25) NOT NULL,
  `cliResumo` varchar(500) NOT NULL,
  `cliImagem` varchar(255) NOT NULL,
  `cliDataCadastro` datetime NOT NULL,
  `cliAtivo` enum('S','N') NOT NULL,
  `cliExcluido` enum('S','N') NOT NULL
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

INSERT INTO `sistema_cliente` (`cliId`, `cliPerfil`, `cliNome`, `cliEmail`, `cliSenha`, `cidId`, `estId`, `cliDataNascimento`, `cliCPF`, `cliTelefone`, `cliResumo`, `cliImagem`, `cliDataCadastro`, `cliAtivo`, `cliExcluido`) VALUES
(1, 'C', 'Maykel Esser', 'maykelesser@teste.com', '21232f297a57a5a743894a0e4a801fc3', 2878, 18, '1988-03-22', '04992271901', '(41) 98401-2834', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In consequat sem id ligula semper, eget blandit neque tincidunt. Donec quis sodales lorem, eget aliquam est. Donec sodales tellus lectus, at lobortis eros suscipit quis. Curabitur tincidunt mattis elit, quis aliquam risus laoreet eget.', '45-25042017231434.png', '2017-04-14 00:29:09', 'S', 'N'),
(5, 'C', 'Ivan', 'ivan@teste.com', '21232f297a57a5a743894a0e4a801fc3', 2878, 18, '0000-00-00', '04992271901', '(32) 13123-1231', 'teste', '', '2017-04-25 21:56:10', 'S', 'N');

CREATE TABLE IF NOT EXISTS `sistema_planos` (
  `plaId` int(11) NOT NULL,
  `plaTitulo` varchar(255) NOT NULL,
  `plaModalidade` enum('M','T','S','A') NOT NULL,
  `plaValor` float NOT NULL,
  `plaCidades` int(11) NOT NULL,
  `plaDescricao` text NOT NULL,
  `plaDataCadastro` datetime NOT NULL,
  `plaAtivo` enum('S','N') NOT NULL,
  `plaExcluido` enum('S','N') NOT NULL
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

INSERT INTO `sistema_planos` (`plaId`, `plaTitulo`, `plaModalidade`, `plaValor`, `plaCidades`, `plaDescricao`, `plaDataCadastro`, `plaAtivo`, `plaExcluido`) VALUES
(1, 'Tradicional', 'M', 19.9, 5, '<ul>  <li>Contempla at&eacute; 5 cidades</li>   <li>Receba notifica&ccedil;&otilde;es realtime</li>   <li>Demandas ilimitadas</li> </ul>', '2017-04-11 00:00:00', 'S', 'N'),
(2, 'Tradicional', 'T', 49.9, 5, '<ul>  <li>Contempla at&eacute; 5 cidades</li>   <li>Receba notifica&ccedil;&otilde;es realtime</li>   <li>Demandas ilimitadas</li> </ul>', '2017-04-11 00:00:00', 'S', 'N'),
(3, 'Tradicional', 'S', 89.9, 5, '<ul>  <li>Contempla at&eacute; 5 cidades</li>   <li>Receba notifica&ccedil;&otilde;es realtime</li>   <li>Demandas ilimitadas</li> </ul>', '2017-04-11 00:00:00', 'S', 'N'),
(4, 'Tradicional', 'A', 129.9, 5, '<ul>\r\n <li>Contempla at&eacute; 5 cidades</li>\r\n <li>Receba notifica&ccedil;&otilde;es realtime</li>\r\n <li>Demandas ilimitadas</li>\r\n</ul>\r\n', '2017-04-11 00:00:00', 'S', 'N'),
(5, 'Escritório', 'M', 59.9, 10, '<ul>  <li>Contempla at&eacute; 10 cidades</li>  <li>Receba notifica&ccedil;&otilde;es realtime</li>   <li>Demandas ilimitadas</li> </ul>', '2017-04-11 00:00:00', 'S', 'N'),
(6, 'Escritório', 'T', 149.9, 10, '<ul>   <li>Contempla at&eacute; 10 cidades</li>  <li>Receba notifica&ccedil;&otilde;es realtime</li>   <li>Demandas ilimitadas</li> </ul>', '2017-04-11 00:00:00', 'S', 'N'),
(7, 'Escritório', 'S', 269.9, 10, '<ul>   <li>Contempla at&eacute; 10 cidades</li>  <li>Receba notifica&ccedil;&otilde;es realtime</li>   <li>Demandas ilimitadas</li> </ul>', '2017-04-11 00:00:00', 'S', 'N'),
(8, 'Escritório', 'A', 389.9, 10, '<ul>\n <li>Contempla at&eacute; 10 cidades</li>\n  <li>Receba notifica&ccedil;&otilde;es realtime</li>\n <li>Demandas ilimitadas</li>\n</ul>\n', '2017-04-11 00:00:00', 'S', 'N'),
(9, 'Benefícios - Bronze', 'M', 3, 15, '<ul>\r\n  <li>Cadastro de at&eacute; 15 cidades</li>\r\n  <li>Melhor colocado nas pesquisas, independente da avalia&ccedil;&atilde;o.</li>\r\n  <li>N&atilde;o incluso no newsletter</li>\r\n</ul>\r\n', '2017-04-11 00:00:00', 'S', 'N'),
(10, 'Benefícios - Prata', 'M', 7, 45, '<ul>\r\n  <li>Cadastro de at&eacute; 45 cidades</li>\r\n  <li>Topo da pesquisa, independente da avalia&ccedil;&atilde;o.</li>\r\n <li>N&atilde;o incluso no newsletter</li>\r\n</ul>\r\n', '2017-04-11 00:00:00', 'S', 'N'),
(11, 'Benefícios - Ouro', 'M', 14, 0, '<ul>\n <li>Cadastro ilimitado de cidades</li>\n  <li>Destaque no topo das buscas</li>\n  <li>Incluso no newsletter mensal</li>\n</ul>\n', '2017-04-11 00:00:00', 'S', 'N');

CREATE TABLE IF NOT EXISTS `sistema_usuario` (
  `usuId` int(11) NOT NULL,
  `usuNome` varchar(255) NOT NULL,
  `usuEmail` varchar(255) NOT NULL,
  `usuSenha` varchar(32) NOT NULL,
  `usuDataCadastro` datetime NOT NULL,
  `usuAtivo` enum('S','N') NOT NULL,
  `usuExcluido` enum('S','N') NOT NULL
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

INSERT INTO `sistema_usuario` (`usuId`, `usuNome`, `usuEmail`, `usuSenha`, `usuDataCadastro`, `usuAtivo`, `usuExcluido`) VALUES
(1, 'Administrador', 'maykelesser@gmail.com', '21232f297a57a5a743894a0e4a801fc3', '2016-02-18 12:47:52', 'S', 'N');

ALTER TABLE `sistema_assinatura`
  ADD PRIMARY KEY (`assId`);

ALTER TABLE `sistema_assinatura_cidade`
  ADD PRIMARY KEY (`ascId`);

ALTER TABLE `sistema_assinatura_cliente`
  ADD PRIMARY KEY (`ascId`);

ALTER TABLE `sistema_assinatura_plano`
  ADD PRIMARY KEY (`aspId`);

ALTER TABLE `sistema_avaliacao`
  ADD PRIMARY KEY (`avaId`);

ALTER TABLE `sistema_cidade`
  ADD PRIMARY KEY (`cidId`);

ALTER TABLE `sistema_cliente`
  ADD PRIMARY KEY (`cliId`);

ALTER TABLE `sistema_planos`
  ADD PRIMARY KEY (`plaId`);

ALTER TABLE `sistema_usuario`
  ADD PRIMARY KEY (`usuId`);

ALTER TABLE `sistema_assinatura`
  MODIFY `assId` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=5;

ALTER TABLE `sistema_assinatura_cidade`
  MODIFY `ascId` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=33;

ALTER TABLE `sistema_assinatura_cliente`
  MODIFY `ascId` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=5;

ALTER TABLE `sistema_assinatura_plano`
  MODIFY `aspId` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=6;

ALTER TABLE `sistema_avaliacao`
  MODIFY `avaId` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=2;

ALTER TABLE `sistema_cidade`
  MODIFY `cidId` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=5565;

ALTER TABLE `sistema_cliente`
  MODIFY `cliId` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=6;

ALTER TABLE `sistema_planos`
  MODIFY `plaId` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=12;

ALTER TABLE `sistema_usuario`
  MODIFY `usuId` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=2;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa, agora que me liguei, eu posso usar desta maneira mesmo, e inserir normalmente no ORDER BY lá embaixo as demais necessidades. Então, acho que o problema tá resolvido! \o/

 

Só preciso saber como deixar as duplicidades da maneira correta. Como um cliente pode ter mais de um plano, ao usar o INNER JOIN, está mostrando mais registros do que deveria. Porém, se eu uso GROUP BY c.cliId, ele ordena errado! Se eu deixar sem, ordena certo, porém, duplicado (exemplo anexo).

 

 

 

Captura de Tela 2017-05-01 às 16.41.05.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para tirar os duplicados é fácil com uma sub-query usando distinct (sub-query é vida hahahaha)
 

SELECT DISTINCT campos... FROM (
  /*
       Sua query aqui, tudo aquilo mesmo!
  */
)t

Importante: Para evitar problemas, na sua query principal

SELECT * FROM sistema_cliente c 
[...]

Tire o asterisco e especifique todos os campos, pois olhei no seu print que a coluna cliId esta duplicando, e isso vai dar erro depois.

A coluna novo_plaId não precisa ser especificada depois do distinct, alias, não estou certo se precisava dar esse nome para ela :)

Compartilhar este post


Link para o post
Compartilhar em outros sites
Citar

... a. Como um cliente pode ter mais de um plano, a ...

 

 

Aí precisa definir o que quervser visto , um contrato , todos etc.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@EdCesar @Motta mesmo fazendo o Distinct, está trazendo as informações erradas.

 

O ID 6 tem planos com previlégios maiores do que o ID 5, então deveria aparecer na seguinte ordem:

 

1 - 6 - 5

 

E está aparecendo (como mostra o anexo)

 

1 - 5 - 6

 

Detalhe: O ID 5 não possui nenhum plano com o ID 11, 10 e 9 (como mostra no SELECT CASE). Ele deveria aparecer após todos.


    SELECT DISTINCT c.cliId, cliPerfil, cliNome, cliEmail, cliSenha FROM sistema_cliente c 
    INNER JOIN sistema_assinatura_cliente ac ON ac.cliId = c.cliId 
    INNER JOIN (
                SELECT cliId,
                CASE
                    WHEN ap.plaId = 11 THEN 1
                    WHEN ap.plaId = 10 THEN 2
                    WHEN ap.plaId = 09 THEN 3
                END AS novo_plaId
            FROM sistema_assinatura a 
                INNER JOIN sistema_assinatura_cliente ac ON ac.assId = a.assID 
                INNER JOIN sistema_assinatura_plano ap ON ap.assId = a.assID
                WHERE ap.aspSituacao = 3
            ) ap
    ON ap.cliId = c.cliId
    WHERE cliAtivo = 'S' 
    AND cliExcluido = 'N' 
    AND c.cidId IN (
        SELECT cidId FROM sistema_assinatura_cidade 
        WHERE cidId IN (2878)
    ) 
    AND c.cliId IN (
        SELECT cliId FROM sistema_assinatura a 
        INNER JOIN sistema_assinatura_cliente ac ON ac.assId = a.assID 
        INNER JOIN sistema_assinatura_plano ap ON ap.assId = a.assID
        WHERE ap.aspSituacao = 3
    ) 
    ORDER BY novo_plaId
    LIMIT 0,15

 

Captura de Tela 2017-05-06 às 21.35.48.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Tudo bem pessoal?
       
      No código abaixo, estou fazendo uma consulta nas tabelas, banners e banners_referencia
      Meu objetivo é trazer resultados com valores iguais ao nome da cidade declarada na $cidade ou resultados com a referencia Total.
      O problema é que está trazendo todos os resultados. Tenho 10 linhas, 1 com o nome da cidade e duas com o valor Total, então o resultado teria que ser de apenas 3 linhas, mas mostra tudo.
       
      $banner = "SELECT A.*, B.* FROM banners A, banners_referencia B WHERE B.cod_referencia = A.cod_referencia AND A.cidade = '$cidade' OR B.referencia = 'Total' ORDER BY RAND()";
      $banner = mysqli_query($conexao, $banner) or die ("Banner não encontrado");
      while($busca= mysqli_fetch_array($banner)){
          print $busca['cidade'].'<br>';
      };
       
      Alguém consegue me ajudar?
    • Por luiz monteiro
      Olá, tudo bem?
       
      Estou melhorando meu conhecimento em php e mysql e, me deparei com o seguinte. A tabela da base de dados tem um campo do tipo varchar(8) o qual armazena números. Eu não posso alterar o tipo desse campo. O que preciso é fazer um select para retornar o números que contenham zeros a direita ou a esquerda.
      O que tentei até agora
       
      Ex1
      $busca = $conexao->prepare("select campo form tabela where (campo = :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form']);
       
      Se a direita da string $_REQUEST['campo_form'] termina ou inicia com zero ou zeros, a busca retorna vazio.
      Inseri dados numéricos, da seguinte maneira para testar: 01234567;  12345670: 12345678: 12340000... entre outros nessa coluna. Todos os valores que não terminam ou não iniciam com zero ou zeros, o select funciona.
       
       
      Ex2
      $busca = $conexao->prepare("select campo form tabela where (campo = 0340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex3
      $busca = $conexao->prepare("select campo form tabela where (campo = '02340001' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex4
      $busca = $conexao->prepare("select campo form tabela where (campo like 2340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex5
      $busca = $conexao->prepare("select campo form tabela where (campo like '12340000') ");
      Esse número está cadastrado, mas não retorna.
       
      Ex6
      $busca = $conexao->prepare("select campo form tabela where (campo like '"12340000"' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex7
      $busca = $conexao->prepare("select campo form tabela where (campo like :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form'])
      Não retorna dados.
       
      O  $_REQUEST['campo_form'] é envio via AJAX de um formulário. 
      Usei o gettype para verificar o post, e ele retorna string.
      Fiz uma busca com número 12345678 para verificar o que o select retorna, e também retrona como string.
       
      Esse tipo de varchar foi usado porque os números que serão gravados nesse campo,  terão zeros a direita ou na esquerda. Os tipos number do mysql não gravam zeros, então estou usando esse. O problema é a busca.
      Agradeço desde já.
       
       
    • Por ILR master
      Fala galera, tudo certo?
       
      Seguinte: No servidor A estou tentando fazer uma consulta com o servidor B, mas está dando erro.
      Estou usando o mesmo código de conexão do servidor B que funciona perfeitamente, mas no servidor A, dá erro.
      Segue código:
       
      $host = 'servidor B';
      $user = 'user';
      $pass = '********';
      $db   = 'banco';
       
      // conexão e seleção do banco de dados
      $conexao = mysqlI_connect($host, $user, $pass, $db);
      mysqlI_set_charset($conexao,"utf8");
      //print "Conexão rodando e OK!"; 
      //mysqlI_close($conexao);
       
      Alguém pode me ajudar?
    • Por douglas79
      Bom dia,

      Há alguns dias que venho instalar o apache, o php, mysql e o phpmyadmin manualmente e sem obter sucesso. Até consegui rodar o php, porém, quando vou baixar a úitima versão do MYSQL, não tem todos os pacotes nele instalados, inclusive no completo, só encontro o Router.
      Alguém pode me dizer o porquê que isso está ocorrendo?
      Desde já agradeço a ajuda de vocês, que será bem vinda!
      No aguardo!

      Uso a versão 8.3.9 do PHP
      Meu SO é o Windows 10 32 bits
    • Por landerbadi
      Tenho uma tabela chamada "item" com os seguintes campos: id, name, active. Nela tem cadastrado vários itens. No campo "active" eu coloco a letra "S" para informar que este item está ativo no sistema. Por exemplo: 1, casa, S 2, mesa, S 3, cama, S 4, moto S 5, rádio O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo active. E outra tabela chamada "product" com os seguintes campos (id, name) com os seguintes registros: 1, Produto A 2, Produto B 3, Produto C E uma terceira tabela chamada "product_item" com os seguintes campos (productID, itemID). No campo productID eu coloco o id de um produto da tabela "product" e no campo "itemID" eu coloco o id do produto da tabela "item". Exemplo: 1, 1 1, 3 1, 4 2, 3 2, 4 Sendo assim o produto A da tabela 'product" comtem os itens casa, cama e moto. Eu preciso fazer uma busca da seguinte maneira:  Eu escolho um registro da tabela "item", por exemplo "casa". Preciso fazer com que o php me liste todos os registros da tabela "product" que contenham a palavra "casa" e que os demais itens estejam ativos no siste. Ou seja, que contenham um "S" no campo "active"  Eu consegui fazer isso da seguinte maneira: SELECT P.id, P.name, GROUP_CONCAT(I.name ORDER BY I.name) AS items FROM product P JOIN product_item PI ON P.id = PI.productID JOIN item I ON I.id = PI.itemID AND I.active = 'S' WHERE P.id NOT IN ( SELECT PI.productID FROM product_item PI JOIN item I ON I.id = PI.itemID WHERE I.active IS NULL ) AND P.id IN ( SELECT PI.productID FROM product_item PI JOIN item I ON I.id = PI.itemID WHERE I.name = 'mesa' ) GROUP BY P.id, P.name; O problema que eu estou tendo é o seguinte:
      Quando eu jogo este código para o banco de dados onde eu já tenho os registros cadastrado o php fica lendo uma eternidade e não lista os produtos.
       
      Usando código no banco de dados que eu fiz para testes ele funciona perfeitamente pois nele tem poucos registros.
       
      No banco de dados principal a tabela "item" tem 11.196 registros. A tabela "product" tem 88.214 registros e a tabela "product_item" tem 518.378 registros. 
       
      Eu acredito que, devido o banco de dados ser muito grande, ele não consegue listar.
       
      Alguém sabe de algum meio de resolver isso?
       
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.