Didyo
-
Total de itens
5 -
Registro em
-
Última visita
Posts postados por Didyo
-
-
Olá pessoal, tive pensando em resolver a questão com algo tipo
SELECT c.`cat_id` as id, c.`cat_nome_fantasia` as empresa, i.img_nome as imagem FROM `catalogo` c
LEFT JOIN (SELECT * FROM imagens WHERE fk_catalogo_id=c.cat_id LIMIT 3) i ON c.cat_id=i.fk_catalogo_idPorém a coluna cat_id na subquery (WHERE fk_catalogo_id=c.cat_id ) não é reconhecida.
Sabem se existe alguma forma de mudar isso? Tipo tornar a coluna Global.
Então tentei
SELECT (@valor_id:=c.`cat_id`) as id, c.`cat_nome_fantasia` as empresa, i.img_nome as imagem FROM `catalogo` c
LEFT JOIN (SELECT * FROM imagens WHERE fk_catalogo_id=@valor_id LIMIT 3) i ON c.cat_id=i.fk_catalogo_idPorém o @valor_id parece não ter ficado setado, pois não retornou registros.
Por fim tentei setar a variável.
SET @valor_id:=1;
SELECT (@valor_id:=c.`cat_id`) as id, c.`cat_nome_fantasia` as empresa, i.img_nome as imagem FROM `catalogo` c
LEFT JOIN (SELECT * FROM imagens WHERE fk_catalogo_id=@valor_id LIMIT 3) i ON c.cat_id=i.fk_catalogo_idNesse caso quase funcionou, buscou as imagens com LIMIT.
Mas, ficou preso a setar manualmente o @valor_id, ou seja, só busca as imagens do id setado, o que não teria serventia, pois poderia inserir o id direto no SELECT contido no JOIN.
Alguém tem alguma ideia de como resolver?
Obrigado
-
Olá pessoal, consegui solucionar o problema de 2 formas.
Minha ideia era relacionar 2 tabelas de um cardápio, exemplo (itens e bebidas) sem usar relacionamento n:m, mas armazenando os ids das bebidas em um campo "lista_bebidas".
Para quem desejar, ao invés de usar o operador IN no JOIN ON,
basta usar o FIND_IN_SET com GROUP_CONCAT e GROUP BY
para agrupar os resultados por linha.Tabela cardapio_itens (* apenas demonstrativo)
id || item_nome || lista_bebidas
1 || refri 300ml || 1,2,4,5
2 || refri 600ml || 2,3,5
Tabela cardapio_bebidas (* apenas demonstrativo)
id || nome_bebida
1 || cola
2 || guaraná
3 || uva
4 || laranja
5 || limão
Solução 1 - com uso de JOIN: (para mim, a preferida)
SELECT i.*, GROUP_CONCAT(b.nome_bebida) as bebidas FROM cardapio_itens i
LEFT JOIN cardapio_bebidas b ON FIND_IN_SET(b.id, i.lista_bebidas)
GROUP BY i.id
Resultado:
1 || refri 300ml || cola, guaraná, laranja, limão
2 || refri 600ml || guaraná, uva, limão
Solução 2 - com uso de Subquery:
SELECT i.*, (SELECT GROUP_CONCAT(b.nome_bebida) as bebidas FROM cardapio_bebidas b WHERE FIND_IN_SET(b.id, i.lista_bebidas) ORDER BY b.nome_bebida ASC) FROM cardapio_itens i
Essa escolha foi para evitar um grande número de linhas em uma tabela de ligação n:m, devido a serem vários restaurantes e bares com várias bebidas em tamanhos diferentes.
Sei que para uma questão de integridade,... a melhor opção seria a terceira tabela n:m. Se o esperado fosse apenas alguns milhares de linhas até usaria n:m com uma tabela de junção itens_has_bebidas.
Obrigado a todos
-
Olá pessoal, não sei se é possível mas minha ideia seria usar o operador IN dentro de um JOIN
substituindo o "=".
Ex: Teria uma tabela itens_cardapio (car_id, car_nome, car_bebidas)
e outra tabela > bebidas (b_id, b_nome)Sei que poderia relaciona n:m tendo uma tabela tipo itens_cardapio_has_bebidas (fk_car_id, fk_b_id) porém queria fazer diferente pois para o que quero isso geraria muitas linhas na tabela de junção.
Gostaria que o campo car_bebidas na 1ª tabela armazenasse os ids das bebidas da 2ª tabela. Ex. car_bebidas=1,2,5,6,9,11
e na consulta ficaria algo do tipo:
SELECT i.* , GROUP_CONCAT(b.b_nome) FROM itens_cardapio i
INNER JOIN bebidas b ON (b.b_id IN i.car_bebidas)Tentei também algo tipo
SELECT i.* , (SELECT b.nome FROM bebidas b WHERE b.b_id IN i.car_bebidas) FROM itens_cardapio i
Usei algumas variação com GROUP BY e GROUP_CONCAT,...Consegui obter resultados como:
- a primeira bebida de cada item do cardápio
- repetir várias vezes cada bebida por item,
e outros, mas nenhum 100% correto.Se no IN usar os números dos ids das bebidas manualmente, ao invés de puxar de um campo, ele busca as bebidas pedidas,
porém não fica dinâmico, pois é sempre os mesmos números de modo a todos itens do cardápio ficaram com (coca-cola,sprite,fanta) por exemplo.Se tiverem alguma ideia agradeço.
-
Olá pessoal, gostaria de saber se é possível e como limitar a quantidade de linha retornadas usando JOIN.
A ideia é limitar a quantidade de linhas retornadas da tabela filho em relação a cada linha da tabela pai.Ex. Tenho 10 registros de imóveis na tabela_imv e cada um destes possui mais de 12 imagens na tabela_imgs (cada imagem em uma linha diferente).
Usando o LEFT JOIN gostaria que para cada imóvel fossem trazidas apenas 5 imagens usando LIMIT 5 de modo que a cada 5 imagens encontradas, a busca cessasse na tabela filho, e retomasse procurando as 5 primeiras imagens do próximo imóvel.
Desde já agradeço a atenção.
JOIN limitar registros da tabela filho por cada linha da tabela pai
em MySQL
Postado
Bem pessoal consegui uma solução simples, que não é exatamente o que procurava,
mas dá para quebrar um galho.
Vou continuar tentando encontrar a solução para a forma original que queria, usando (LIMIT) dentro do JOIN.
Objetivo:
Uso de 2 tabelas relacionadas 1:n onde temos vários imóveis na primeira tabela e cada imóvel possui várias imagens em outra tabela.
Objetivo: Retornar apenas 5 imagens para cada imóvel em um SELECT com JOIN.
Solução provisória:
Ter na tabela imagens, além dos campos como (id, fk_id_imovel, nome_img, diretorio),
um campo ordem_imgs que deverá ser populado com números sequências iniciando no 1.
Assim no SELECT ficaria algo do tipo:
SELECT i.*, img.* FROM imoveis i
LEFT JOIN imagens img ON img.fk_id_imovel=i.id AND img.ordem_imgs <=5
Só para base de conhecimento:
Pode-se usar uma biblioteca JQuery como (sortable) junto com o PHP e MySql para se ordenar as imagens arrastando-as (DRAG and Drop) no lado do cliente de modo a atualizar a sequência de números que determina a ordem das imagens na tabela do banco de dados.