Parzival Posted December 8, 2022 at 07:55 PM Report Share #628670 Posted December 8, 2022 at 07:55 PM (edited) Boas, Eu tenho o objetivo de tentar relacionar a tabela «ROTAS» com «PRODUTOS» onde irei criar a tabela «CARGA» para ajudar(eu acho😅) ROTAS(ID_ROTA, ID_CAMIAO, ID_CLIENTE, ID_CARGA) CARGA(ID_CARGA, "aqui eu iria criar uma tabela 'temporaria' «PRODUTO_CARGA»") |------------CARGA---------- | | id_carga | aqui supostamente o id da tabela(produto_carga) | | 213 | 27 | PRODUTO_CARGA(ID_PRODUTO, QNT) |---PRODUTO_CARGA--- | | id_produto | QNT | | 213 | 27 | |etc... PRODUTO(ID_PRODUTO, NOME, MARCA, VALOR) Mas como consigo fazer a parte de ir buscar uma tabela inteira e não so uma "row"? Agradeço desde já:) FOTO DA BASE DE DADOS (phpMyAdmin DESIGNER) Edited December 8, 2022 at 08:15 PM by Parzival esquecime de colocar imagem "One day or day one, you decide." Link to comment Share on other sites More sharing options...
M6 Posted December 9, 2022 at 03:19 PM Report Share #628693 Posted December 9, 2022 at 03:19 PM Não sei se percebi bem o que pretendes, mas o que tens descrito no texto e o que tens descrito na imagem do modelo relacional não é a mesma coisa. Ignorando o que tens na imagem e focando exclusivamente no que tens aqui no texto: a tua base de pensamento está quase totalmente correta. As tuas "falhas" são: na questão da tabela temporária "carga" que não tem nada de temporária e não irá apontar para a tabela "produto_carga". a tabela "produto_carga" tem de fazer a ligação entre um produto e uma carga, logo tem de ter uma chave para a tabela "carga" Depois é só fazeres a query começando na "carga" e ires percorrendo as tabelas até chegares à tabela "produtos": select rotas.*, produtos.* from rotas inner join carga on rotas.id_rota = carga.id_rota inner join produto_carga on carga.id_carga = produto_carga.id_carga inner join produtos on produto_carga.id_produto = produto.id_produto 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar." Link to comment Share on other sites More sharing options...
Parzival Posted February 2, 2023 at 08:21 PM Author Report Share #630003 Posted February 2, 2023 at 08:21 PM On 12/9/2022 at 3:19 PM, M6 said: Não sei se percebi bem o que pretendes, mas o que tens descrito no texto e o que tens descrito na imagem do modelo relacional não é a mesma coisa. Ignorando o que tens na imagem e focando exclusivamente no que tens aqui no texto: a tua base de pensamento está quase totalmente correta. As tuas "falhas" são: na questão da tabela temporária "carga" que não tem nada de temporária e não irá apontar para a tabela "produto_carga". a tabela "produto_carga" tem de fazer a ligação entre um produto e uma carga, logo tem de ter uma chave para a tabela "carga" Depois é só fazeres a query começando na "carga" e ires percorrendo as tabelas até chegares à tabela "produtos": select rotas.*, produtos.* from rotas inner join carga on rotas.id_rota = carga.id_rota inner join produto_carga on carga.id_carga = produto_carga.id_carga inner join produtos on produto_carga.id_produto = produto.id_produto Pode tentar explicar um bocado o código SQL que colocou aqui: On 12/9/2022 at 3:19 PM, M6 said: select rotas.*, produtos.* from rotas inner join carga on rotas.id_rota = carga.id_rota inner join produto_carga on carga.id_carga = produto_carga.id_carga inner join produtos on produto_carga.id_produto = produto.id_produto Não consegui entender muito bem. Como funciona o INNER JOIN e assim. Já pesquisei na internet e não consegui entender a sintaxe nem como funciona. Será que me pode explicar? "One day or day one, you decide." Link to comment Share on other sites More sharing options...
M6 Posted February 3, 2023 at 10:29 AM Report Share #630010 Posted February 3, 2023 at 10:29 AM (edited) O InnerJoin selecciona apenas os registos que exitem em ambas as tabelas através dos campos definidos na cláusula On. Por exemplo, em select rotas.*, carga.* from rotas inner join carga on rotas.id_rota = carga.id_rota Vais ter todas as rotas para as quais existe carga, ou seja, vais escolher apenas os registos que existem em ambas as tabelas carga e rota que se relacionam através dos campos referidos na cláusula On. Se houver rotas sem carga, essas rotas não vão aparecer. Podes ver isso se tiveres registos na tabela de rotas para os quais não há registos na tabela de carga. Exemplo: tens uma rota com o id_rota = 23 mas ainda não tens carga para essa rota (não existe nenhum registo na tabela carga com o valor 23 na coluna id_rota), esse registo da rota não vai aparecer. Se tiveres nas tuas tabelas situações dessas, quando executares essa query vais ver que vais ter sempre registos totalmente listados, tanto na parte da rotas.* como na parte da carga.*, mas só são listados os registos que existam em ambas as tabelas. Já se fizeres um Left Join: select rotas.*, carga.* from rotas left join carga on rotas.id_rota = carga.id_rota Vais ter todas as rotas quer exista, ou não, carga para as mesmas. Seguindo o exemplo acima da rota que não tem ainda carga, vais ver que vão sair todos os registos que obtiveste anteriormente com o InnerJoin mais aqueles para os quais ainda não há carga. Vês isso de forma simples: os registos de rota.* estão sempre preenchidos e os registos de carga.* estão preenchidos caso existam senão são listados a null/vazios. Este artigo explica bem (com diagramas de Venn e exemplos) esta questão do InnerJoin, LeftJoin (e afins): https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins Uma dica: ignora e não tentes perceber mas nada antes de compreenderes o InnerJoin e o LeftJoin nas suas expressões mais simples. Depois disso vai ser simples compreender o resto, como por exemplo que o RightJoin é a mesma coisa que o LeftJoin mas aplicado invesamente às tabelas (pelos diagrama percebes logo). Edited February 3, 2023 at 10:32 AM by M6 1 Report 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar." Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now