Ir para conteúdo
Fórum Script Brasil

Didyo

Membros
  • Total de itens

    5
  • Registro em

  • Última visita

Tudo que Didyo postou

  1. 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.
  2. 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_id Poré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_id Poré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_id Nesse 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
  3. 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
  4. 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.
  5. 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.
×
×
  • Criar Novo...