Eu gravei os valores de um duplo select no banco ficando assim:
[id] = [valor]
[23] = [1;2;3;4;5;31]
Agora como eu faco pra carregar um select com esses valores separados por ponto e virgula.
Eu gravei os valores de um duplo select no banco ficando assim:
[id] = [valor]
[23] = [1;2;3;4;5;31]
Agora como eu faco pra carregar um select com esses valores separados por ponto e virgula.
Olha o mysql não tem explode como você mesmo disse.
Mas pode tentar usar as funções para string como o locate(), substring() e SUBSTRING_INDEX().
Veja mais em: http://dev.mysql.com/doc/refman/5.5/en/string-functions.html
Resolvi da seguinte maneira:
Descobri que se usar um igual no WHERE, o SC vai passar para IN no código gerado, por exemplo:
WHERE id = {grupo}
Sendo {grupo} um campo duplo select, no código gerado vai ficar assim:
WHERE id IN (1,2,3,4,5,6)
Santos,
realmente, eu já havia visto que o SC gera na clausua where a condição IN ( através do debug ).
No caso do IN qualquer banco de dados utiliza o operador “OU”. Ex: var IN (1;2;3), logo var = 1 ou var = 2 ou var = 3.
A minha necessidade eu preciso que atenda as 3. var = 1 and var = 2 and var = 3.
Existe uma forma para fazer isso, mas preciso saber quais e quantos itens foram selecionados no duplo select.
Como você disse ele monta os itens separados por ( vou utilizar o explode, criar uma variavel global para receber a quantidade itens do array e coloco um count() = a variavel global ( quantidade de itens do array ).
Veja abaixo meu ambiente e solução
Exemplo dos dados cadastrados:
Relacionamento : DIAGNOSTICO d 1 : N SINTOMAS s ( 1 DIAGNOSTICO para N SINTOMAS )
PK DIAGNOSTICO: #num_paciente, # data_consulta, #cod_doenca
PK SINTOMAS: #num_paciente, # data_consulta, #cod_doenca, #cod_sintoma
d. num_paciente d.data_consulta d. cod_doenca s. cod_sintoma
100 10/05/2007 01 11
01 15
64 05/12/2008 20 11
20 15
20 67
Pela regra do negócio, se forem selecionados, no duplo select, os sintomas 11, 15, 67 somente a doença 20 pode ser retornada, pois só ela possui os 3 sintomas ao mesmo tempo.
Abaixo mostro a query que utilizando, a partir dos dados acima, que quando executo no SQL, retorna somente o cod_doença = 20 ( o correto para a regra do negócio).
SELECT s.num_paciente, s.data_consulta, s.cod_doenca, d.descricao, p.nome, p.idade, p.sexo, p.nascimento
FROM ( SELECT s.num_paciente, s.data_consulta, s.cod_doenca
FROM sintomas s WHERE s.cod_sintoma IN (11,15,67) ) t1, paciente p, doenca d // OBS 1
WHERE p.num_paciente = t1.num_paciente
AND d.cod_doenca = t1.cod_doenca
GROUP BY s.num_paciente, s.data_consulta, s.cod_doenca
HAVING COUNT(*) = 3 //OBS 2
Explicando a query acima:
O 2º Select que fica dentro do From do Select principal (Obs 1), traz todas as doenças ( 01 e 20 ), que possuam pelo menos um sintoma selecionado, então precisaria saber quais os códigos dos sintomas no filtro foram selecionados. para montar o IN no 2º Select (OBS 1) e quantos foram selecionados para utilizar na cláusula HAVING do SELECT principal.(OBS 2)
Santos, veja bem, essa query atende a minha necessidade, significa que seria o mesmo se pudesse montar a clausula Where assim:
Where var1 = 11
and var1 = 15
and var1 = 67.
Vamos tentar.
Assim que conseguir vou postar a solução no Fórum.
Obrigado.
JLuiz.
Muito legal essa regra, se entendi bem, com alguns (três) parâmetros (sintomas) você identifica um padrão pra poder sugerir alguma doença…
Sem querer fugir muito do assunto, mas se de repente alguém bater aqui por causa do duplo select, de repente possa ser ajudado. Hoje eu precisei resolver o seguinte problema:
Com o IN você procura um campo cujo valor esteja em um determinado conjunto de valores:
SELECT id FROM equipe WHERE id_local IN (1,2,3)
Mas e se você precisar verificar os campos (duplo select) que contenham um determinado valor? Eu consegui assim:
SELECT id,id_local FROM equipe WHERE FIND_IN_SET(4,replace(id_local,’;’,’,’))
Resultado:
3 3,4
4 3,4,5
5 4,5
23 4,7,8
Não conhecia o FIND_IN_SET. Muito interessante.
O que eu preciso é saber quantos itens foram selecionados do duplo-select.
No exemplo que mostrou, id e id_local aparecem os id_locais de cada id, mas como saber quantos são os id_locais?
Seu ex.: id = 3 possui no id_local 2 itens.
no id = 4 possui no id_local 3 itens.
É a quantidade de itens é que vai me trazer a doenca correspondente.
Consegui explicar melhor a minha necessidade?
Ainda não fiz a tentativa, estou terminando uma procedure em SQL para fazer a carga no novo sistema. Bem complicado.
Abrs,
JLuiz.
Eu pensaria em usar um select com checkbox no SC, conforme link do video abaixo:
(Aos 4:44 minutos explica radiobutton e aos 5:06 explica o checkbox)
http://downloads.netmake.com.br/site/videos/videos/news_v6_pt_br/news_v6_pt_br.html
a) Passa o select para múltiplos valores;
b) Definir um delimitador (vírgula);
c) Clicar sim em “Usar Checkbox em drop down”.
(Se decidir usar também dá uma olhada em: http://www.netmake.com.br/forum/index.php/topic,6069.msg27864.html#msg27864)
Com isso o SC vai gravar um campo varchar, por exemplo, separando os valores selecionados entre vírgulas (delimitador). Daí é só recuperar o valor gravado e fazer algo do tipo:
$qtd = count( explode(",", $locais) );
A função explode() retorna um array de strings, formado pela divisão da string conforme o delimitador; o count() conta o número de elementos do array.
Pode-se ainda, pra ficar mais interativo e mais interessante, usar jQuery para pegar os valores no onClick, filtrar e carregar os valores da sua consulta por ajax. Se precisar usar os valores no SELECT (MySQL) pra filtrar, não daria mesmo pra usar IN pq ele funciona como OR, então pra usar o AND dá pra fazer assim:
$campos = explode(",", $locais);
if ( count($campos)>2 ){
$condicao = "id = “;
$condicao .= implode(” AND id = ", $campos );
(aplicar o filtro)
}
Porque você não utilizam uma tabela de ligação N:N e utilizam no form uma ligação N:N Relations, aí unam as informações com JOIN e tratem as strings com php mesmo?
Respondendo ao Santos: Não dá para utilizar a solução checkbox, pois carrego uma tabela com aproximadamente 5000 registros. A forma mais prática é um duplo-select no qual o usuário pode selecionar os que deseja.
Respondendo ao Saulo: Minha aplicação é do tipo Consulta. Tenho um filtro, que possui um campo problema que vem de uma tabela PROBLEMAS que é FK da tabela SINTOMAS. Essa tabela SINTOMAS possui uma FK ( que faz parte da PK dela) da tabela DIAGNOSTICOS (que é a doença).
Logo, uma DOENÇA possui vários SINTOMAS. (relação 1:N), então quando seleciono no filtro vários SINTOMAS, necessito trazer da tabela DIAGNOSTICO todas as doenças que possuem todos os SINTOMAS selecionados.
O que o SC está fazendo no Duplo-Select é utilizar o operador IN na cláusula WHERE (utilizando o debug do SC aparece o operador IN), com isso aparecem as doenças que possuem pelo menos um dos SINTOMAS selecionados. Isso não atende.
O que precisava saber é como fica montado o dataset no duplo-select para utilizar o EXPLODE, dessa forma saberei quais e quanto itens foram selecionados. Se der uma olhada na Query que montei (acima) poderá entender minha necessidade.
Mesmo assim obrigado pela dica. É sempre importante, pois pode não servir para mim, mas com toda certeza poderá servir para alguém. Agora, se puder exemplificar ou explicar melhor a sua solução agradeço também.
Sds
JLuiz
Olá Saulo, você poderia dar um exemplo de como fazer um JOIN tratando as strings com PHP ?
Abração!