Ir para conteúdo
Fórum Script Brasil

Didyo

Membros
  • Total de itens

    5
  • Registro em

  • Última visita

Posts postados por Didyo

  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_idnã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...