Jump to content

Erros (?) do MYSQL


Kissema
 Share

Recommended Posts

Bondia caros @programadores, estou perante uma situação aparentemente simples em resolver, estou a utilizar o MySQL 5.6.14 mas não está atendendo as perspectivas.Gostaria que analisassem e me dão algumas sugestão, pode ser que eu é que estou equivocado.Esta é a estrutura da Tabela

create table Doenca_Sintoma (doenca_cod int,sintoma_cod int);

Exemplo de registos

1,10

1,20

1,30

2,30

3,40

Eu preciso apenas a(s) doença(s) com todos os seguintes sintomas (10,20,30)

Este funciona traz as doenças com o código 1 e 2 (atravéd do sintoma 30)

select * from Doenca where cod in (select doena_cod from Doenca_Sintoma where sintoma_cod in (10,20,30))

mas eu quero que traga apenas a doença 1 que tem todos os sintomas. Então o select seria o seguinte

select * from Doenca where cod in (select doena_cod from Doenca_Sintoma where sintoma_cod = ALL (10,20,30))

mas dá erro de SYNTAX

@ pr@tic@ f@z o m&str&

Link to comment
Share on other sites

não dás muita informação sobre as tuas tabelas, as o que procuras será algo deste género:

select Doenca.*
 from Doenca inner join Doenca_Sintoma on     Doenca.cod = Doenca_Sintoma.doenca_cod
                                          and sintoma_cod in (10, 20, 30)
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

HappyHippyHippo, na verdade essa query nao retorna exactamente a query que Kissema propoe.

Kissema, tanto quanto consigo averiguar, a query que apresentas esta' correcta. Quando a executas qual e' o problema exactamente? Da' erro de sintax? Nao retorna nada? Retorna algo mas esse algo esta' errado?

O meu conselho passaria por confirmar que realmente existem os codigos na tabela Doenca. Experimenta primeiro executar a inner query (select doena_cod from Doenca_Sintoma where sintoma_cod in (10,20,30)) para ver se esta funciona correctamente, e se sim, entao tenta perceber o que esta' de errado com a query completa.

Link to comment
Share on other sites

obrigado @HappyHippyHippo na verdade o select anterior funciona mas eu quero utilizar o "= ALL" quê para poder retornar apenas as doenças que contêm todos os sintomas listados.

Já fiz a correcção do texo acima.

 SELECT doenca_cod
   FROM Doenca_Sintoma 
GROUP BY doenca_cod
 HAVING SUM(sintoma_cod NOT IN (10, 20, 30)) = 0
    AND SUM(sintoma_cod = 10) = 1
    AND SUM(sintoma_cod = 20) = 1
    AND SUM(sintoma_cod = 30) = 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

  1. Este query só poderá funcionar para estes casos com três sintomas. Mas o objectivo é executar o query com os sintomas seleccionados pelo utilizador e que variam muito.
  2. SQL aceita a utilização de = ALL (10,20,30) que eu acho que seja a opção mais fiável para resolver esta sityuação. Até mesmo a documentação do MySQL suporta isto, mas como é que está a dizer que contem um erro de Syntax?
  3. Espero que simulem no MySQL uma situação parecida e vejam no que dá.

@ pr@tic@ f@z o m&str&

Link to comment
Share on other sites

[*]Este query só poderá funcionar para estes casos com três sintomas. Mas o objectivo é executar o query com os sintomas seleccionados pelo utilizador e que variam muito.

onde está a complicação já que terás de construir a SQL após a selecção dos sintomas ?

construir por construir, vai dar tudo ao mesmo

[*]SQL aceita a utilização de = ALL (10,20,30) que eu acho que seja a opção mais fiável para resolver esta sityuação. Até mesmo a documentação do MySQL suporta isto, mas como é que está a dizer que contem um erro de Syntax?

o SQL apresentada não dá erro de sintaxe

[*]Espero que simulem no MySQL uma situação parecida e vejam no que dá.

O CÓDIGO APRESENTADO FOI TESTADO

sim, coloquei em caps lock devido ao desrespeito apresentado ao esperar que se lhe faça todo a papinha (apesar de ter sido feita), o que é algo ilógico num fórum/tópico de ajuda e não de freelancing

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Com todo o respeito @HappyHippyHippo pense antes de julgar, vc ñ sabe quem é quem na sua vida pessoal e professional. Digo isto porque não gostei deste último comentário

Em 16/09/2014 às 16:07, HappyHippyHippo disse:

onde está a complicação já que terás de construir a SQL após a selecção dos sintomas ?

construir por construir, vai dar tudo ao mesmo

o SQL apresentada não dá erro de sintaxe

O CÓDIGO APRESENTADO FOI TESTADO

sim, coloquei em caps lock devido ao desrespeito apresentado ao esperar que se lhe faça todo a papinha (apesar de ter sido feita), o que é algo ilógico num fórum/tópico de ajuda e não de freelancing

Mas para esclarecer que eu ñ estou precisando de papinhas primeiramente consulte o meu perfil e tópicos participados. Aqui vão alguns imagens para mostrar o erro que o MySQL detecta embora eu acho que não contem nenhum erro de Syntax.

le45e.jpg

segunda imagem

20us5dg.jpg

terceira imagem

dmaetx.jpg

@ pr@tic@ f@z o m&str&

Link to comment
Share on other sites

Lendo o manual do MySql, eles falam que o ALL deve ser usado com uma subquery.

Na tua query:

select * from Doenca where cod in (select doena_cod from Doenca_Sintoma where sintoma_cod = ALL (10,20,30))

Em vez do 10,20,30

Exprimenta antes fazer:

SELECT 10
UNION
SELECT 20
UNION
SELECT 30
Link to comment
Share on other sites

#RicardoCosta obrigado, mas na mesma não funciona, e na verdade eu acho que deve ser um erro interno do próprio MySQL, é por isso que eu pedi que testassem.

No manual do MySQL os exemplos são parecidos com estes mesmos, até tentei utilizar exactamente os exemplos do MySQL, mesmo assim não funcionou.

@ pr@tic@ f@z o m&str&

Link to comment
Share on other sites

#RicardoCosta obrigado, mas na mesma não funciona, e na verdade eu acho que deve ser um erro interno do próprio MySQL, é por isso que eu pedi que testassem.

No manual do MySQL os exemplos são parecidos com estes mesmos, até tentei utilizar exactamente os exemplos do MySQL, mesmo assim não funcionou.

errado.

o exemplo que é apresentado no site do MySQL é muito diferente do que pretendes (ao qual já foi apresentada uma solução testada)

este é a resolução do "operador" ALL que se encontra no site :

The word ALL, which must follow a comparison operator, means “return TRUE if the comparison is TRUE for ALL of the values in the column that the subquery returns.”

o que quer dizer que o valor a ser comparado deverá resultar em verdadeiro para TODOS os valores resultados do subquery.

isto é completamente diferente de dizer que:

- X é maior do que todos os valores dum conjunto do valores

do que dizer algo sem sentido como :

- X é igual a todos os valores dum conjunto de valores

responde lá quando é que um valor X é igual a todos os valores de um conjunto :

- "só e só se os valores desse conjunto são somente o valor exacto a comparar, nem menos nem mais valores".

---------------------

agora que isto está esclarecido, faz scroll para cima e vê a solução que já te foi apresentada porque funciona

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

ok, obrigado a todos pelas dicas, eu acho que o erro deve ter sido meu, na interpretação da utilização do

ALL

eu percebi o seguinte:

sintoma_cod > ALL (SUBQUERY)

considerando os resultados da subquery seria

sintoma_cod >ALL(10,20,30)

o funcionamento interno do MySQL é (no meu ponto de vista), comparar o

 sintoma_cod

com todos os elementos listados (um de cada vez)

10,20,30

e, se obedecer a condição (neste caso '>') retorna true.

Logo se a condição for '=' em vez de '>' também retornaria TRUE

não tenho dúvidas nenhuma que a solução

 SELECT doenca_cod
   FROM Doenca_Sintoma
GROUP BY doenca_cod
 HAVING SUM(sintoma_cod NOT IN (10, 20, 30)) = 0
 AND SUM(sintoma_cod = 10) = 1
 AND SUM(sintoma_cod = 20) = 1
 AND SUM(sintoma_cod = 30) = 1

funciona.

Apenas achei estranho o erro de sintaxe do MySQL.

Acima de tudo, obrigado a todos mais uma vez.

@ pr@tic@ f@z o m&str&

Link to comment
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
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.