Dúvida em SQL - consulta a várias tabelas

khaluh

Power Member
Viva

Durante a optimização de um site, resolvi trocar o seguinte código de SQL
PHP:
$maquina =     "
                    SELECT *
                    FROM  maquina
                    ORDER BY ma_id_maq
                "
                ;
por este
PHP:
        $diversos = mysql_query(    "
                                SELECT    ma_id_maq, cf_nome, cb_nome, dvd_nome, cd_nome, cm_nome, cp_nome
                                FROM    maquina, cod_fontes, cod_boards, cod_cddvd, cod_discos, cod_memorias, cod_processador
                                WHERE    ma_board    = cb_cod_board
                                AND        ma_cddvd    = dvd_cod_cddvd
                                AND        ma_discos     = cd_cod_discos
                                AND        ma_fonte    = cf_cod_fonte
                                AND        ma_mem        = cm_cod_memoria
                                AND     ma_proc        = cp_cod_proc
                                ORDER BY     ma_id_maq
                                "
                                );
Quais as diferenças? No primeiro aparecem apenas os id's dos diversos itens, no segundo pretendo que apareçam os nomes dos materiais (de modo a poder identificar por nome os componentes de cada computador).

A dúvida (ou o problema em si) é que dá-me um erro na consulta (e estou aqui as voltas à um tempo e ainda não consegui perceber como corrigir a consulta).

Obs. Os nomes dos campos estão correctos
 
Última edição:
... ou LEFT JOIN, depende do pretendido.

não esquecer que os campos no query têm de assumir depois: id.tabela_x, nome.tabela_y.


abraço,
 
Provavelmente tem alguma coisa a ver com o facto de fazeres select a várias tabelas, e não identificares univocamente, como foi dito acima, a qual tabela pertencem os campos, na expressão where.

Se tiveres 2 tabelas com 2 campos de nome igual, e se esses campos aparecerem na expressão where, o sql não vai adivinhar...
 
SoundSurfer disse:
Se colocasses o erro, seria mais fácil, digo eu.
Eu tenho a seguinte instrução :
PHP:
$resultado = mysql_query($diversos)  
    or  die ("Não foi possível realizar a consulta por motivos técnicos.");
e ele devolve : Não foi possível realizar a consulta por motivos técnicos.
SpEeDyGoNzAlEs disse:
Provavelmente tem alguma coisa a ver com o facto de fazeres select a várias tabelas, e não identificares univocamente, como foi dito acima, a qual tabela pertencem os campos, na expressão where.

Se tiveres 2 tabelas com 2 campos de nome igual, e se esses campos aparecerem na expressão where, o sql não vai adivinhar...
Exacto, daí os nomes estranhos nos campos. Cada nome de campo tem incluido a tabela a que pertence, exemplo: ma_id_maq onde é o campo id_maq (identificação da máquina) da tabela maquina (daí o ma antes)

Em relação ao INNER JOIN ou LEFT JOIN, como que sugerem que faça a consulta?
 
Última edição:
[RESOLVIDO] Dúvida em SQL - consulta a várias tabelas

Viva.

Já resolvi o problema, resolvi ir adicionando campo a campo, de modo a detectar o erro. O que é certo é que acabei por nao detectar nenhum erro e ficou a funcionar.

PHP:
                                    // Apresentação das maquinas existentes
    $maquina =     "
                    SELECT ma_id_maq, cf_nome, dvd_nome, cb_nome, cd_nome, cm_nome, cp_nome, ep_estado
                    FROM  maquina, cod_fontes, cod_cddvd, cod_boards, cod_discos, cod_memorias, cod_processador, estado_produto
                    WHERE ma_fonte = cf_cod_fonte
                    AND ma_cddvd = dvd_cod_cddvd
                    AND ma_board = cb_cod_board
                    AND    ma_discos = cd_cod_discos
                    AND    ma_mem = cm_cod_memoria
                    AND ma_proc    = cp_cod_proc
                    AND ma_estado = ep_estado
                    ORDER BY ma_id_maq
                "
                ;
 
Só um aparte.

Era muito mais facil teres criado apenas uma tabela para todos os componentes e diferencia-los por um campo dessa tabela. Algo do genero
cod_componente||Nome||Fonte||CDDVD||BOARD||DISCO||(...)

Era muito mais facil fazeres actualizações sobre a aplicação e muito mais facil de retirares informação da DB. Além do mais se quiseres acrescentar novos componentes apenas necessitavas de acrescentar uma nova coluna a uma tabela em vez de criares tabelas novas e refazer as querys
 
a melhor koisa paara isso e testares primeiro o query em sql , e so depois passar para php

o inner join é equivalente aos wheres em que estas a ligar as chaves estrangeiras...
achei alguma piada , quando te pediram a msg de erro , teres dito que te dizia a msg de erro do die() lol...

ha uma funçao php, que te devolve o erro do mysql é mais facil para prcurar erros.

mas se kalhar ate podia ser algum erro tecniko do servidor lol
 
Back
Topo