Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Maykel-ctba

Agrupamento de itens pelo menor preço

Recommended Posts

Fala galera,

 

Tenho um sistema onde faço uma consulta de determinados produtos.

Cada produto tem em média mais de 3 preços (conforme a quantidade da compra, o preço diminui).

 

Porém, na busca, preciso retornar apenas o menor preço de cada produto.

 

Tentei utilizar GROUP BY, mas está dizendo que a sintaxe está incorreta.

SELECT p.*, pp.* 

FROM sistema_produto p, sistema_produto_secao ps, sistema_produto_preco pp 

WHERE proAtivo = 'S' 
AND proExcluido = 'N' 
AND ps.secId = 1 
AND p.proId = ps.proId 
AND p.proId = pp.proId 

ORDER BY pp.prpValor ASC 
GROUP BY p.proId

Se eu tiro o Group By, funciona, porém, traz um registro diferente para cada produto (por razões óbvias, hehe).

 

wmEz7RX.png

 

Como posso agrupar pelo valor menor? O que tem de errado nesta sintaxe?

 

Pensei em agrupar num AS:

SELECT p.*, (SELECT prpValor FROM sistema_produto_preco WHERE proId = p.proId ORDER BY prpValor ASC LIMIT 1) AS proMenorValor 

FROM sistema_produto p,sistema_produto_secao ps 

WHERE proAtivo = 'S' 
AND proExcluido = 'N' 
AND ps.secId = 1 
AND p.proId = ps.proId

E funciona. Mas se eu precisar usar o "proMenorValor" num WHERE, eu não consigo, dá erro.

 

Exemplo:

AND (proMenorValor BETWEEN 250 AND 450)

 

 

#1054 - Unknown column 'proMenorValor' in 'where clause'

 

E aí? hahaha

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Alaerte,

 

Obrigado pelo retorno, cara! Retornou apenas os dois produtos desejados, porém não com os menores valores de cada um. Por isso, pensei em usar o ORDER (mas parece que ORDER e GROUP não funcionam juntos, é isso?)

 

Editei meu post acima com uma tentativa que quase deu certo. Só preciso poder utilizar o "alias" criado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

entendi que voce quer que retorne os produtos por grupo, apresentando apenas o menor valor...

 

 

pode fazer assim:

SELECT *, MIN(preco) from minhaTabela group by nome order by algumaCoisa ASC;

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Alaerte É, não tenho o campo. Mas achei que poderia utilizar o alias criado.

@rnu.silva Consegui de outro jeito, utilizando HAVING. Com Having, posso utilizar o alias criado como parâmetro para condições!

SELECT p . * , (SELECT prpValor FROM sistema_produto_preco WHERE proId = p.proId ORDER BY prpValor ASC LIMIT 1) AS proMenorValor

FROM sistema_produto p, sistema_produto_secao ps

WHERE proAtivo =  'S'
AND proExcluido =  'N'
AND ps.secId =1
AND p.proId = ps.proId

HAVING proMenorValor BETWEEN 35 AND 45 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@rnu.silva hehehe! O having salvou a pele! Mas vi outro probleminha.

 

Quando não uso nenhum "ps.secId", retornam diversos resultados. Gostaria de agrupá-los, porém, novamente, não deu certo.

 

Tentei primeiro assim:

SELECT p.*, (SELECT prpValor FROM sistema_produto_preco WHERE proId = p.proId ORDER BY prpValor ASC LIMIT 1) AS proMenorValor FROM sistema_produto p,sistema_produto_secao ps WHERE proAtivo = 'S' AND proExcluido = 'N' AND p.proId = ps.proId HAVING proMenorValor BETWEEN 0 AND 48

E vi que Não deu. Aí tentei utilizar INNER JOIN. Deu na mesma.

SELECT p . * , (SELECT prpValor FROM sistema_produto_preco WHERE proId = p.proId ORDER BY prpValor ASC LIMIT 1) AS proMenorValorFROM sistema_produto pINNER JOIN sistema_produto_secao ps ON p.proId = ps.proIdWHERE proAtivo = 'S'AND proExcluido = 'N'HAVING proMenorValor BETWEEN 20 AND 105

xJh7o07.png

 

 

Tentei GROUP BY tanto fora quanto dentro do INNER JOIN, mas sem sucesso. Dá syntax error.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por daemon
      Boa tarde,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, e mostrar a imagem que esta na pagina do link.
      Para isso utilizo esta função:
      function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; }  
      Mas estou com um problema, esta funcão funciona quando coloco em uma pagina de teste.php. Preciso mostrar em uma página inicial diversas fotos de todos os links. (No caso acima só funciona 1).
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.