SELECIONANDO com várias condições WHERE na mesma coluna

Ok, acho que posso estar esquecendo de algo óbvio / simples aqui … mas preciso escrever uma consulta que retorne somente registros que correspondam a vários critérios na mesma coluna …

Minha tabela é uma configuração de vinculação muito simples para aplicar sinalizadores a um usuário …

ID contactid flag flag_type ----------------------------------- 118 99 Volunteer 1 119 99 Uploaded 2 120 100 Via Import 3 121 100 Volunteer 1 122 100 Uploaded 2 

etc … nesse caso, você verá que ambos os contatos 99 e 100 são sinalizados como “Voluntário” e “Carregado” …

O que eu preciso ser capaz de fazer é retornar aqueles contactid que SOMENTE coincidam com múltiplos critérios inseridos através de um formulário de busca … o contactid tem que combinar TODOS os flags escolhidos … na minha cabeça o SQL deve ser algo como:

 SELECT contactid WHERE flag = 'Volunteer' AND flag = 'Uploaded'... 

mas … isso não retorna nada … O que estou fazendo de errado aqui?

    Você pode usar GROUP BY e HAVING COUNT(*) = _ :

     SELECT contact_id FROM your_table WHERE flag IN ('Volunteer', 'Uploaded', ...) GROUP BY contact_id HAVING COUNT(*) = 2 -- // must match number in the WHERE flag IN (...) list 

    (assumindo contact_id, flag é único).

    Ou use joins:

     SELECT T1.contact_id FROM your_table T1 JOIN your_table T2 ON T1.contact_id = T2.contact_id AND T2.flag = 'Uploaded' -- // more joins if necessary WHERE T1.flag = 'Volunteer' 

    Se a lista de sinalizadores for muito longa e houver muitas correspondências, a primeira provavelmente será mais rápida. Se a lista de sinalizadores for curta e houver poucas correspondências, você provavelmente descobrirá que a segunda é mais rápida. Se o desempenho for uma preocupação, tente testar ambos os dados para ver qual funciona melhor.

    Usar:

      SELECT t.contactid FROM YOUR_TABLE t WHERE flag IN ('Volunteer', 'Uploaded') GROUP BY t.contactid HAVING COUNT(DISTINCT t.flag) = 2 

    O principal é que a contagem de t.flag precisa ser igual ao número de argumentos na cláusula IN .

    O uso de COUNT(DISTINCT t.flag) é para o caso de não haver uma restrição exclusiva na combinação de contactid e flag – se não houver possibilidade de duplicatas, você poderá omitir o DISTINCT da consulta:

      SELECT t.contactid FROM YOUR_TABLE t WHERE flag IN ('Volunteer', 'Uploaded') GROUP BY t.contactid HAVING COUNT(t.flag) = 2 

    Considere o uso do INTERSECT assim:

     SELECT contactid WHERE flag = 'Volunteer' INTERSECT SELECT contactid WHERE flag = 'Uploaded' 

    Eu acho que é a solução mais logística.

    realmente não pode ver sua mesa, mas a bandeira não pode ser “Voluntária” e “Carregada”. Se você tiver vários valores em uma coluna, poderá usar

     WHERE flag LIKE "%Volunteer%" AND flag LIKE "%UPLOADED%" 

    não é realmente aplicável ver a tabela formatada.

    Tente usar essa consulta alternativa:

     SELECT A.CONTACTID FROM (SELECT CONTACTID FROM TESTTBL WHERE FLAG = 'VOLUNTEER')A , (SELECT CONTACTID FROM TESTTBL WHERE FLAG = 'UPLOADED') B WHERE A.CONTACTID = B.CONTACTID; 

    Altere AND para OU. Erro simples. Pense nisso como inglês simples, quero selecionar qualquer coisa com isso igual a isto ou aquilo.

     SELECT contactid, Count(*) FROM  WHERE flag in ('Volunteer','Uploaded') GROUP BY contactid HAVING count(*)>1; 

    AND você retornará uma resposta somente quando tanto o volunteer quanto o uploaded estiverem presentes em sua coluna. Caso contrário, retornará o valor null

    tente usar OR em sua declaração …

     SELECT contactid WHERE flag = 'Volunteer' OR flag = 'Uploaded' 

    Às vezes você não pode ver a madeira para as trees 🙂

    Seu SQL original ..

     SELECT contactid WHERE flag = 'Volunteer' AND flag = 'Uploaded'... 

    Deveria estar:

     SELECT contactid WHERE flag = 'Volunteer' OR flag = 'Uploaded'... 
     select purpose.pname,company.cname from purpose Inner Join company on purpose.id=company.id where pname='Fever' and cname='ABC' in ( select mname from medication where mname like 'A%' order by mname ); 

    seu código :

     SELECT contactid WHERE flag = 'Volunteer' AND flag = 'Uploaded' [...] 

    não funcionará, pois você não declarou o nome da tabela. a execução retornará uma mensagem de erro.

    e se você quiser que ambas as consultas de pesquisa sejam exibidas, seu código deve se parecer com algo assim.

     SELECT * FROM (your_table_name) WHERE flag = 'Volunteer' OR flag = 'Uploaded'; 

    e não assim porque sempre retornará false SELECT * FROM (your_table_name) WHERE flag = ‘Voluntário’ AND flag = ‘Uploaded’;

    você também pode fazer isso

     SELECT * FROM (your_table_name) WHERE flag = 'Volunteer' OR flag = 'Uploaded' ORDER BY contactid, flag asc; 

    (asc para ordem ascendente, você também pode alterá-lo para desc se desejar que seja exibido em ordem decrescente)