Exibindo resultado de consulta a dois campo diferentes da mesma tabela.

SQL

MySQL

10/10/2016

Amigo, bom dia!

Tenho a seguinte consulta SQL:

SELECT freq_id, freq_curso, freq_md_curso, freq_md_disc, freq_md_prof, freq_md_mat_didat

FROM montar_turma

WHERE freq_curso LIKE '%17%' AND freq_md_curso LIKE '%17%'

ORDER BY freq_id DESC



Preciso que todos os registros do campo "freq_curso" sejam exibidos quando ele for igual ao campo "freq_md_curso". Para isso, preciso criar outras consultas alterando apenas o número da LIKE, que no exemplo eu coloquei 17. O número 17 refere-se ao número de cadastro do curso, e para cada curso, um número diferente, claro.

Desde já, agradeço!
Myller Meireles

Myller Meireles

Curtidas 0

Melhor post

William Alves

William Alves

10/10/2016

Bom dia Myller Meireles,

Os campos freq_md_curso e freq_curso são chaves primárias de quais tabelas?

Se esses dois campos são da mesma tabela então faça o seguinte:

SELECT freq_id, freq_curso, freq_md_curso, freq_md_disc, freq_md_prof, freq_md_mat_didat
 
FROM montar_turma
 
WHERE freq_curso = freq_md_curso
 
ORDER BY freq_id DESC



Ou se são identificadores (Id) de outras tabelas e estão na tabela 'montar_turma' como chaves estrangeiras faça o seguinte:


SELECT freq_id, freq_curso, freq_md_curso, freq_md_disc, freq_md_prof, freq_md_mat_didat
 
FROM montar_turma
 INNER JOIN TABELA_FREQUENCIA_CURSO AS TFC ON TABELA_FREQUENCIAQ_MD_CURSO AS TFMC ON TFC.freq_curso =  TFMC.freq_md_curso
 
ORDER BY freq_id DESC



Testa e me avisa se deu certo ok?


Abraço!
GOSTEI 1

Mais Respostas

Luiz Santos

Luiz Santos

10/10/2016

Myller
Não entendi muito bem sua duvida.
Poderia explicar melhor?
Pelo que entendi, não seria só usar um IN em vez do LIKE?

Grande abs
GOSTEI 0
William Alves

William Alves

10/10/2016

Retificando*:

Ou se são identificadores (Id) de outras tabelas e estão na tabela 'montar_turma' como chaves estrangeiras faça o seguinte:

SELECT freq_id, freq_curso, freq_md_curso, freq_md_disc, freq_md_prof, freq_md_mat_didat
 
FROM montar_turma as MT
 INNER JOIN TABELA_FREQUENCIA_CURSO AS TFC ON TFC.freq_curso = MT.freq_curso
 INNER JOIN TABELA_FREQUENCIAQ_MD_CURSO AS TFMC ON TFC.freq_curso =  TFMC.freq_md_curso
ORDER BY freq_id DESC
GOSTEI 0
Myller Meireles

Myller Meireles

10/10/2016

Olá Luiz, boa tarde!

Obrigado por me responder!

O comando SQL que citei funciona, mas não me traz o que preciso, que é o seguinte:

O que preciso é que quando um aluno estiver na turma 17 (freq_curso), seja exibido todos os materiais didáticos correspondentes ao curso no qual ele está cadastrado (freq_md_curso).

Quando executo a consulta que postei, o MySQL me retorna a mensagem: "MySQL não retornou nenhum registro". Mas sendo que tenho registros nos referidos campos que possibilitariam a exibição do resultado que espero.

Espero ter sido claro.


E aí
GOSTEI 0
Luiz Santos

Luiz Santos

10/10/2016

Cara, esses dois dados estão na mesma tabela?
Estranho....
É possivel um curso 15, por exemplo possuir materiais do 16 além do 15? (por exemplo).
Acho que para o seu caso, a melhor solução é essa segunda que o Willian postou.

Retificando*:

Ou se são identificadores (Id) de outras tabelas e estão na tabela 'montar_turma' como chaves estrangeiras faça o seguinte:

SELECT freq_id, freq_curso, freq_md_curso, freq_md_disc, freq_md_prof, freq_md_mat_didat
 
FROM montar_turma as MT
 INNER JOIN TABELA_FREQUENCIA_CURSO AS TFC ON TFC.freq_curso = MT.freq_curso
 INNER JOIN TABELA_FREQUENCIAQ_MD_CURSO AS TFMC ON TFC.freq_curso =  TFMC.freq_md_curso
ORDER BY freq_id DESC
GOSTEI 0
Myller Meireles

Myller Meireles

10/10/2016

Olá William Alves, boa tarde!


Grato por sua resposta!


Os campos freq_md_curso e freq_curso não são chaves primárias. São campos do tipo VARCHAR da tabela "montar_turma". A chave primária dessa tabela é o campo freq_id.


Quando aplico a sua sugestão de código, o MySQL retorna um conjunto vazio. Mesmo tendo nos campos "freq_md_curso" e "freq_curso" os dados do referido curso que pudesse me trazer um resultado satisfatório.


Você teria outra sugestão?


Obrigado!
GOSTEI 0
Luiz Santos

Luiz Santos

10/10/2016


SELECT freq_id, freq_curso, freq_md_curso, freq_md_disc, freq_md_prof, freq_md_mat_didat
   FROM montar_turma
 WHERE freq_curso =  freq_md_curso 
      AND freq_curso = '17'
 ORDER BY freq_id DESC

GOSTEI 0
Luiz Santos

Luiz Santos

10/10/2016

Supondo que não haja "match" entre freq_curso e freq_md_curso não vai retornar nada.


SELECT freq_id, freq_curso, freq_md_curso, freq_md_disc, freq_md_prof, freq_md_mat_didat
   FROM montar_turma
 WHERE freq_curso =  freq_md_curso 
      AND freq_curso = '17'
 ORDER BY freq_id DESC

GOSTEI 0
Myller Meireles

Myller Meireles

10/10/2016

Luiz,

Sim, estão na mesma tabela!

Sobre sua pergunta sobre o material do curso 15 no 16, digo que não. Pois quando eu cadastro o material didático, eu informo para qual curso ele será disponibilizado.

A segunda que o William postou seria interessante seu eu estivesse trabalhando com chave estrangeira, mas não.

Tens alguma outra ajuda? :-)
GOSTEI 0
Myller Meireles

Myller Meireles

10/10/2016

Exato, Luiz!

Não aparece nada!

Como pode isso, se temos dados nos referidos campos?
GOSTEI 0
Luiz Santos

Luiz Santos

10/10/2016

Você pode pegar seu código e colocar o OR em vez de AND.
Assim ele vai trazer se qualquer um dos campos contiver o valor 17.
No original, ele só vai trazer se os dois tiverem o valor 17 ao mesmo tempo.
GOSTEI 0
William Alves

William Alves

10/10/2016

Olá Luiz, boa tarde!

Obrigado por me responder!

O comando SQL que citei funciona, mas não me traz o que preciso, que é o seguinte:

O que preciso é que quando um aluno estiver na turma 17 (freq_curso), seja exibido todos os materiais didáticos correspondentes ao curso no qual ele está cadastrado (freq_md_curso).

Quando executo a consulta que postei, o MySQL me retorna a mensagem: "MySQL não retornou nenhum registro". Mas sendo que tenho registros nos referidos campos que possibilitariam a exibição do resultado que espero.

Espero ter sido claro.


E aí


Myller Meireles,


De acordo com o post acima o identificador da turme é o campo 'freq_curso', e o identificador do curso é o freq_md_curso, e o objetivo é exibir todos os materiais didáticos correspondentes ao curso(freq_md_curso) certo?

Se for isso provavelmente você montou uma tabela assim:

freq_curso freq_md_curso
17 1
17 2
17 3
E assim vai....

Mas percebe que a turma (freq_curso) está relacionada a vários cursos ( freq_md_curso), ou seja, se o aluno pertence a turma 17 logo ele herdara o curso 1, 2 e 3 e esses cursos possuem materiais didáticos relacionados a eles, logo precisaria de pelo menos uma tabela que representaria os Materiais didáticos para conseguirmos linkar.

Mas o ideal mesmo seria você reestruturar seu banco e criar uma Tabela para a Turma, Curso e Materiais Didáticos e fazer os devidos links utilizando Foreign key e fazer os INNER JOIN como disse o Luiz Santos.

Mas se você já não pode mais reestruturar seu banco, poderia mandar aqui nos comentários o resultado de uma pesquisa com todos os campos e especificando o que significa cada campo? Pq a partir disso conseguiremos te ajudar melhor com mais clareza.

Abraço!
GOSTEI 0
William Alves

William Alves

10/10/2016

Myller Meireles,

De acordo com o post acima o identificador da turme é o campo 'freq_curso', e o identificador do curso é o freq_md_curso, e o objetivo é exibir todos os materiais didáticos correspondentes ao curso(freq_md_curso) certo?

Se for isso provavelmente você montou uma tabela assim:

freq_curso freq_md_curso
17 1
17 2
17 3
E assim vai....

Mas percebe que a turma (freq_curso) está relacionada a vários cursos ( freq_md_curso), ou seja, se o aluno pertence a turma 17 logo ele herdara o curso 1, 2 e 3 e esses cursos possuem materiais didáticos relacionados a eles, logo precisaria de pelo menos uma tabela que representaria os Materiais didáticos para conseguirmos linkar.

Porém o ideal mesmo seria você reestruturar seu banco e criar uma Tabela para a Turma, Curso e Materiais Didáticos e fazer os devidos links utilizando Foreign key e fazer os INNER JOIN como disse o Luiz Santos.

Mas se você já não pode mais reestruturar seu banco, poderia mandar aqui nos comentários o resultado de uma pesquisa com todos os campos e especificando o que significa cada campo? Pq a partir disso conseguiremos te ajudar melhor com mais clareza.

Abraço!
GOSTEI 0
Myller Meireles

Myller Meireles

10/10/2016

Luiz...

Vou aplicar sua sugestão e lhe aviso se deu certo!

Mais uma vez, obrigado!
GOSTEI 0
Myller Meireles

Myller Meireles

10/10/2016

William,

Obrigado pelo retorno!

Vou colocar isso em prática amanhã com mais calma e informo para vc os campos e os seus significados.

Realmente deixei de dar alguma informações importantes para que vcs pudessem me ajudar da maneira correta.

Valeu...
GOSTEI 1
Myller Meireles

Myller Meireles

10/10/2016

Fala Luiz....


Cara, deu certo (finalmente) colocando o "OR" que vc sugeriu!


Com isso, todos os Materiais Didáticos (MD) correspondentes ao curso 17 são exibidos. Agora o problema é que nessa tabela (montar_turma), eu tenho mais de 6.000 registros eles são exibidos na consulta em branco, conforme o link: http://donabeldade.com.br/images/mysql.jpg


Como resolver a exibição desses campos em branco, mostrando apenas os campos que estão com os MDs cadastrados?


Já tentei usar no "WHERE" o "<>" mas não rolou!


Obrigado pela ajuda!
GOSTEI 0
Myller Meireles

Myller Meireles

10/10/2016

Oi William, blza?!


Não, o identificador da tabela é o "freq_id". Os campos freq_curso e freq_md_curso são campos "VARCHAR". Mas o objetivo está correto!

Fuçando o código da consulta e testando após vários erros, consegui resolver em 100% usando o seguinte código:

SELECT freq_id, freq_curso_curso, freq_md_curso, freq_md_disc, freq_md_prof, freq_md_mat_didat, freq_md_md
FROM montar_turma
WHERE freq_md_md = 'MatDidatico' and freq_curso_curso LIKE '%17%' or freq_md_curso LIKE '%17%'
ORDER BY freq_id DESC


De acordo com a ajuda que o amigo Luiz Santos também contribuiu, sobre o "OR" na consulta.

O que eu fiz foi colocar logo após o WHERE o "freq_md_md = 'MatDidatico' and..." e aí sim, só é exibido os registros necessários.


Agradeço a você, William Alves e Luiz Santos pela grande e valiosa ajuda e pelo tempo a mim dispensado!


Valeu!!!
GOSTEI 0
Luiz Santos

Luiz Santos

10/10/2016

Precisando só postar sua duvida.
Grande abraço
Luiz
GOSTEI 0
William Alves

William Alves

10/10/2016

Oi William, blza?!


Não, o identificador da tabela é o "freq_id". Os campos freq_curso e freq_md_curso são campos "VARCHAR". Mas o objetivo está correto!

Fuçando o código da consulta e testando após vários erros, consegui resolver em 100% usando o seguinte código:

SELECT freq_id, freq_curso_curso, freq_md_curso, freq_md_disc, freq_md_prof, freq_md_mat_didat, freq_md_md
FROM montar_turma
WHERE freq_md_md = ''MatDidatico'' and freq_curso_curso LIKE ''%17%'' or freq_md_curso LIKE ''%17%''
ORDER BY freq_id DESC


De acordo com a ajuda que o amigo Luiz Santos também contribuiu, sobre o "OR" na consulta.

O que eu fiz foi colocar logo após o WHERE o "freq_md_md = ''MatDidatico'' and..." e aí sim, só é exibido os registros necessários.


Agradeço a você, William Alves e Luiz Santos pela grande e valiosa ajuda e pelo tempo a mim dispensado!


Valeu!!!


Obrigado!
GOSTEI 0
POSTAR