Jump to content
eiwes

[Resolvido] Sistema de busca com vários wheres e limit em um só

Recommended Posts

Olá a todos, amigos

 

Estou bolando um sistema na qual o usuário pode "escolher" vários parâmetros, e por fim filtra-los.

 

O que eu pensei (e o jeito mais fácil) foi assim:

 


//exemplo apenas

$a1 = SELECT * FROM TABELA1 WHERE COLUNA1 = 1 LIMIT 10;
$a2 = SELECT * FROM TABELA 1 WHERE COLUNA1 = 2 LIMIT 10;
$a3 = SELECT * FROM TABELA 1 WHERE COLUNA 1 = 3 LIMIT 10;
	foreach()...

return $a1, $a2, $a3...

 

E por aí vai... Suponhamos que o mizeravi faça 30 filtros desse, meu servidor daria um delay MONSTRUOSO e ferraria tudo! (resumindo, cairia).

 

 

Alguém me dá uma luz no fim do túnel? Uso PDO e OOP.

Preciso muito de uma abertura na mente pra saber a possibilidade disso ser melhor ou até mesmo feito no próprio SQL.

 

 

Share this post


Link to post
Share on other sites

Detalhe melhor o problema com o exemplo real (tabela , colunas etc).

 

Em todo caso pesquise por IN

UNION

 

Share this post


Link to post
Share on other sites
3 horas atrás, Motta disse:

Detalhe melhor o problema com o exemplo real (tabela , colunas etc).

 

Em todo caso pesquise por IN

UNION

 

 

Opa, vamos lá Motta :)

 

Acredito que o IN no WHERE é justamente pra isso. (Não conhecia isso)

 

Seria basicamente assim: tenho vários assuntos separados por numeração.

 

Exemplo:

 

TabelaTeste

 

Assunto A | ID = 1

 

Assunto B | ID = 2

 

Assunto C | ID = 3

 

Assunto D | ID = 4

 

 

Existem 20 registros do assunto A; 15 do B; 30 do C e 100 do D (Por exemplo)

 

com  isso, o SQL ficaria assim:

 

SELECT * FROM TabelaTeste WHERE ID_ASSUNTO IN (1, 3, 4)

	//Ou seja, o usuário não solicitou registros do "B". No entanto, trará todos os registros.

 

Haveria a possibilidade de, além de selecionar somente os respectivos assunto, ainda limitar a quantidade de registros por cada assunto?

 

Tipo assim:

SELECT * FROM TabelaTeste WHERE ID_ASSUNTO IN (1, 3, 4) LIMIT 10, 5, 15

// Assim, traria 10 registros do Assunto A, 5 registros do Assunto C e 15 do D.

 

Share this post


Link to post
Share on other sites

 


 

--tente usto

SELECT * FROM TabelaTeste WHERE ID_ASSUNTO = 1 LIMIT 10
UNION
SELECT * FROM TabelaTeste WHERE ID_ASSUNTO = 3 LIMIT 5
UNION
SELECT * FROM TabelaTeste WHERE ID_ASSUNTO = 4 LIMIT

 

Share this post


Link to post
Share on other sites
5 minutos atrás, Motta disse:

 


 


--tente usto

SELECT * FROM TabelaTeste WHERE ID_ASSUNTO = 1 LIMIT 10
UNION
SELECT * FROM TabelaTeste WHERE ID_ASSUNTO = 3 LIMIT 5
UNION
SELECT * FROM TabelaTeste WHERE ID_ASSUNTO = 4 LIMIT

 

PERFEITO!!! Deu certinho. MUITO OBRIGADO, Motta :)

 

Mas uma pergunta, só pra ficar ciente: isso pesa muito o servidor?

Share this post


Link to post
Share on other sites

Pesar é não ter a informação , mas em tese não pois id_assunto seria chave.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By gamesmax2
      Boa noite,
      Pessoal estou com uma dificuldade no MYSQL, estou querendo obter dados de um cadastro caso ele tenha preenchido todos os Campos, tentei usar o Group by mas não tive sucesso.
       
      Minha tabela e a seguinte:
       
      Nome.              Pedido.            Status
      Daniel.              9955.                 Ok
      Daniel.              9954                  Ok
      Rafael.              9940                  Ok
      Rafael.              9941.                 Aberto
      Rafael.              9942.                 Ok
      Rodrigo.            9961.                 Ok
      Rodrigo.            9962.                 Ok
       
       
      Meu objetivo e puxar os nomes que estão com todos o pedidos relacionado em ok, no caso o Rafael não pode aparece pois ele tem um pedido Aberto, porém não conseguir fazer isso, pessoal peco a ajuda de VCS muito o obrigado.
       
      tentei isso aqui: SELECT nome, pedido, status FROM `cadastros` GROUP BY pedido, nome having status = 'Ok'
    • By gamesmax2
      Boa tarde,
      Pessoal estou com uma dificuldade no MYSQL, estou querendo obter dados de um cadastro caso ele tenha preenchido todos os Campos, tentei usar o Group by mas não tive sucesso.
       
      Minha tabela e a seguinte:
       
      Nome.              Pedido.            Status
      Daniel.              9955.                 Ok
      Daniel.              9954                  Ok
      Rafael.              9940                  Ok
      Rafael.              9941.                 Aberto
      Rafael.              9942.                 Ok
      Rodrigo.            9961.                 Ok
      Rodrigo.            9962.                 Ok
       
       
      Meu objetivo e puxar os nomes que estão com todos o pedidos relacionado em ok, no caso o Rafael não pode aparece pois ele tem um pedido Aberto, porém não conseguir fazer isso, pessoal peco a ajuda de VCS muito o obrigado.
       
      tentei isso aqui: SELECT nome, pedido, status FROM `cadastros` GROUP BY pedido, nome ORDER BY having status = 'Ok'  
       
    • By Thiago Btos
      Bom dia pessoal.
       
      Estou com uma dúvida na estruturação do select.
      Tenho um relatório que está extraindo já informações corretamente, com base no período gerado (inicial e final)
      Exemplo de como está hoje:
      SELECT D.CATEGORIA, SUM(D.VALOR) AS VALOR_VENDA, D.DATA AS (MES_ANO) FROM DUAL D WHERE D.DATA BETWEEN '20210501' AND '20210731' GROUP BY D.CATEGORIA, D.DATA Retornando:
      Categoria | Valor_venda     | Mes_Ano
      1                |     1000,00         | 05/2021
      1                |     2000,00         | 06/2021
      1                |       800,00         | 07/2021
      2                |      500,00          | 05/2021
      2                |      200,00          | 07/2021
      2                |      700,00          | 06/2021
       
      Até ai está tranquilo.
      Porém foi solicitado para adicionar uma coluna YTD (Year to data - acumulado do ano) agrupando o valor total da venda do ano do filtro.
      Então se foi colocado uma data do período Jan/2020 a Mar/2020, essa nova coluna tem que pegar as vendas do ano inteiro de 2020
       
      E precisa me retornar assim:
       
      Categoria | Valor_venda     | Mes_Ano  |  YTD
      1                |     1000,00         | 05/2021   |  15000,00
      1                |     2000,00         | 06/2021   |  15000,00
      1                |       800,00         | 07/2021   |  15000,00
      2                |      500,00          | 05/2021   |  8000,00
      2                |      200,00          | 07/2021   |  8000,00
      2                |      700,00          | 06/2021   |  8000,00
       
      (Os valores de 15000 e 8000 seria a soma do ano inteiro)
       
      O que consegui pensar seria um subselect que tem o where com data do ano, porém nesse caso retorno mais de um resultado no subselect, não dando para usar...
       
      Qual seria a alternativa que tenho?
       
    • By rafaelmoreira78
      Boa tarde!
      Estou querendo fazer um select a partir da seleção de um combobox. Nesse combobox o usuário escolhe o tipo de busca que ele quer. Se é por nome, por id, por data etc. E depois, exibe os dados nos campos. Porém, não estou conseguindo e não sei como resolver isso.
      public void consultar(){ String sql ="select * from tbcertificados where ?=?"; try{ pst=conexao.prepareStatement(sql); pst.setString(1,cbConsulta.getSelectedItem().toString()); pst.setString(2,txtBusca.getText()); rs=pst.executeQuery(); if (rs.next()){ lblID.setText(rs.getString(1)); txtNome.setText(rs.getString(2)); comboCursos.setSelectedItem(rs.getString(3)); txtData.setText(rs.getString(4)); txtCH.setText(rs.getString(5)); txtEmpresa.setText(rs.getString(6)); txtObs.setText(rs.getString(7)); }  
    • By osmarindy
      Boa noite Pessoal.
      Estou com o seguinte problema. Tenho duas tabelas principais "tblProjeto" e "tblItensProjeto", tenho que selecionar o projeto (tblProjeto) cujo o item 19 (tblItensProjeto) já esteja concluído (status 5) e que o item 15 (tblItensProjeto) não esteja concluído (status 5) e nem cancelado (status 4).
      Tenho o seguinte código:
      SELECT p.nmProjeto, l.nmLocalidade, f.usuario, r.nmRequisitante, p.dtSolicitacao,p.dtPrevisaoEntrega, s.nmStatus FROM tblProjeto as p inner join tblItensProjeto as i on i.idProjeto = p.idProjeto inner join tblLocalidade as l on l.idLocalidade = p.idLocalidade inner join tblFuncionario as f on f.idFuncionario = p.idFuncionario inner join tblRequisitante as r on r.idRequisitante = p.idRequisitante inner join tblStatusProj as s on s.idStatus = i.idStatus where (i.idAtividade = 19 and i.idStatus= 5 ) and (i.idAtividade = 15 and (i.idStatus <> 5 and i.idStatus <> 4))
      Se executo um  filtro de cada vez (where i.idAtividade = 19 and i.idStatus= 5 ) ou (i.idAtividade = 15 and (i.idStatus <> 5 and i.idStatus <> 4)) eles trazem resultados, mas quando deixo os dois filtros não funciona.
      Possuo 5 projetos que estão com a atividade 19 concluída e atividade 15 pendente. mas, não consigo com esse select trazer a informação. Alguém sabe como posso resolver?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.