Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SELECT * DE várias tabelas. MySQL


O que você faz aqui é chamado de JOIN (embora você faça isso implicitamente porque você seleciona em várias tabelas). Isso significa que, se você não colocou nenhuma condição em sua cláusula WHERE, você tinha todas as combinações dessas tabelas. Somente com sua condição, você restringe sua junção às linhas em que o ID da bebida corresponde.

Mas ainda há X várias linhas no resultado para cada bebida, se houver X fotos com esse drink_id específico. Sua declaração não restringe qual foto(s) que você quer ter!

Se você quiser apenas uma linha por bebida, precisará informar ao SQL o que deseja fazer se houver várias linhas com um determinado drinks_id. Para isso, você precisa de agrupamento e uma função agregada . Você diz ao SQL quais entradas você deseja agrupar (por exemplo, todos os drinks_ids iguais) e no SELECT, você tem que dizer qual das entradas distintas para cada linha de resultado agrupada deve ser tomada. Para números, isso pode ser médio, mínimo, máximo (para citar alguns).

No seu caso, não vejo sentido em consultar as fotos para bebidas se você quiser apenas uma linha. Você provavelmente pensou que poderia ter uma matriz de fotos em seu resultado para cada bebida, mas o SQL não pode fazer isso. Se você quiser apenas qualquer photo e você não se importa com o que vai pegar, apenas agrupe pelo drinks_id (para obter apenas uma linha por bebida):
SELECT name, price, photo
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id 
GROUP BY drinks_id


name     price   photo
fanta    5       ./images/fanta-1.jpg
dew      4       ./images/dew-1.jpg

No MySQL, também temos GROUP_CONCAT , se você quiser que os nomes dos arquivos sejam concatenados em uma única string:
SELECT name, price, GROUP_CONCAT(photo, ',')
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id 
GROUP BY drinks_id


name     price   photo
fanta    5       ./images/fanta-1.jpg,./images/fanta-2.jpg,./images/fanta-3.jpg
dew      4       ./images/dew-1.jpg,./images/dew-2.jpg

No entanto, isso pode ser perigoso se você tiver , dentro dos valores do campo, pois provavelmente você deseja dividir isso novamente no lado do cliente. Também não é uma função agregada SQL padrão.