Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda com um Select


douglasdamame

Pergunta

Olá Pessoal,

Estou querendo fazer um select mas não estou conseguindo encontrar a lógica.

Banco de dados:

Título

Descrição

Categoria

No caso terei a categoria A, B, C e D

Quero mostrar 10 produtos randomicos mas da seguinte forma:

Item 1 - Categoria A

Item 2 - Categoria B

Item 3 - Categoria C

Item 4 - Categoria D

Item 5 - Categoria A

Item 6 - Categoria B

Item 7 - Categoria C

Item 8 - Categoria D

Item 9 - Categoria A

Item 10 - Categoria B

Acho que terei que fazer alguns Ifs para isso funcionar.

OBS: O número de categorias irão variar com o tempo, então não daria para fazer

IF categoria = D then

Categoria = A

End if

Não consigo entender a lógica para resolver isso.

Se puderam me ajudar agradeceria muito

Douglas Damame

Link para o comentário
Compartilhar em outros sites

23 respostass a esta questão

Posts Recomendados

  • 0

Vou tentar me explicar melhor para tentar obter uma ajuda !!

Eu estava escrevendo diversos detalhes e exemplos para tentar me explicar, mas acho melhor mostrar um exemplo funcionando.

http://compare.buscape.com.br/sony-playsta...slim.html?pos=1

O Buscapé e o UOL Shopping mostram seus resultados como desejo.

Observe como são mostrados os resultados.

1- Shoptime

2 - Americanas

3 - Kalunga

4 - Saraiva

5 - Fnac

6 - Shoptime

7 - Americanas

......... E assim vai

Observe que a partir de um determinado ponto somente o shoptime e americanas tem produtos a serem mostrados. As outras, como não tem, ficam fora da listagem. No final desta busca, apenas o shoptime tem produtos.

Tabela Lojas:

ID

Nome_da_Loja

Tabela Produtos:

ID

ID_Loja

Nome_do_Produto

Preço

A relação entre as tabelas é entre ID e ID_Loja

Link para o comentário
Compartilhar em outros sites

  • 0

No exemplo que você citou (Buscapé), se não me egano a query busca sem ordenação nenhuma:

Select a.CodProduto, b.DesLoja From Produtos Inner Join Lojas On a.CodLoja = b.CodLoja

Assim ela traz aleatóriamente, se não me engano baseado na posição que o registro ocupa na tabela.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá,

Utilizando desta forma o Select com INNER JOIN faria a listagem dos produtos aparecerem da forma que o Buscapé e o Shopping Uol mostram??

Se perceber bem, eles não mostram de forma aleatória não. Na verdade eles mostram por uma seqüencia de lojas. Isso é para não acontecer de mostrar 3 produtos de uma loja em seqüencia, o que prejudicaria as outras.

O que eu estou querendo fazer é exatamente o que eles fizeram.

-------------------------------------------------------------------------

Estou tentando fazer como me indicou para ver como ficaria, mas esta dando erro:

Microsoft JET Database Engine (0x80004005)

Tipo não coincidente na expressão.

SQL = "SELECT Lojas.ID, Lojas.Nome_loja, Produtos.ID, Produtos.ID_Loja, Produtos.Produto, Produtos.preço FROM Lojas INNER JOIN Produtos ON Lojas.ID = Produtos.ID_Loja"

Já mudei a posição das tabelas para busca e nada!!

Estou completamente perdido, pois nunca desenvolvi nada com INNER JOIN, e comparando o que eu fiz com os exemplos que eu vi na internet esta correto.

Se puder me ajudar mais um pouco, coloquei os arquivos, ASP e MDB em

www.u2net.com.br/teste.zip

Exemplo do que desejo fazer:

Tabela Lojas

ID_loja---------- Nome_loja

1 ---------------- Americanas

2 ---------------- Shoptime

3 ---------------- Submarino

Tabela Produtos

ID -------- ID_Loja ---------- Produto --------- preço

1 --------- 1 ---------- Celular -------- 850,00

2 --------- 1 ---------- Calculadora --- 100,00

3 --------- 3 ---------- Celular ------- 890,00

4 --------- 2 --------- Playstation ------ 1200,00

5 --------- 2 --------- Oculos ------ 600,00

6 -------- 3 -------- Relogio ------ 830,00

7 -------- 1 -------- Notebook ------ 2800,00

Eu quero mostrar a busca de Produtos ordenado pelo Nome das Lojas, mas intercalando:

1° - Americanas ---- Celular ------ 850,00 ------ ID do produto = 1

2° - Shoptime ------ Playstation --- 1200,00 ---- ID do produto = 4

3° - Submarino ---- Celular -------- 890,00 ----- ID do produto = 3

4° - Americanas ---- Calculadora -- 2800,00 ------ ID do produto = 2

5° - Shoptime ------- Oculos -------- 600,00 ------ ID do produto = 5

6° - Submarino ------ Relogio ------- 100,00 ------ ID do produto = 6

7° - Americanas ---- Notebook ------ 100,00 ------ ID do produto = 7

Se puder me ajudar mais um pouco te agradeceria muito.

Obrigado,

Douglas

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, consegui fazer funcionar o Select como me enviou, mas como falei no post anterior, deste modo não mostrará os resultados como desejo.

Acho que desta forma que eu quero terei que fazer um loop dentro do outro. Tentei fazer desta forma:

<%

abredb  = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("database.mdb")

Set busca = Server.CreateObject("ADODB.Recordset")
SQL = "SELECT *FROM Produtos"
busca.Open SQL, abredb, 1, 3

Do while not busca.Eof

    Set lojas = Server.CreateObject("ADODB.Recordset")
    SQL = "SELECT *FROM Lojas"
    lojas.Open SQL, abredb, 1, 3

    Do while not lojas.Eof
%>
        
        <%  
        id_loja = lojas("id_loja")
        Set produtos = Server.CreateObject("ADODB.Recordset")
        SQL = "SELECT *FROM Produtos where id_loja = "&id_loja&" "
        produtos.Open SQL, abredb, 1, 3
        if not produtos.eof then
        
        %>
        Pruduto n° <% = produtos("id")%> - <% = produtos("produto")%> - <% = produtos("preço")%> - <% = lojas("nome_loja")%> <br />
        <% end if %>
        
        
<%

    Lojas.Movenext
    loop


busca.Movenext
loop
%>
Mas o resultado é: Pruduto n° 1 - Plays station - 650 - Americanas Pruduto n° 3 - playstation 3 - 1780 - ShopTime Pruduto n° 6 - Play - 550 - Bigboygames Pruduto n° 1 - Plays station - 650 - Americanas Pruduto n° 3 - playstation 3 - 1780 - ShopTime Pruduto n° 6 - Play - 550 - Bigboygames Pruduto n° 1 - Plays station - 650 - Americanas Pruduto n° 3 - playstation 3 - 1780 - ShopTime Pruduto n° 6 - Play - 550 - Bigboygames Pruduto n° 1 - Plays station - 650 - Americanas Pruduto n° 3 - playstation 3 - 1780 - ShopTime Pruduto n° 6 - Play - 550 - Bigboygames Pruduto n° 1 - Plays station - 650 - Americanas Pruduto n° 3 - playstation 3 - 1780 - ShopTime Pruduto n° 6 - Play - 550 - Bigboygames Pruduto n° 1 - Plays station - 650 - Americanas Pruduto n° 3 - playstation 3 - 1780 - ShopTime Pruduto n° 6 - Play - 550 - Bigboygames Ou seja, esta fazendo 6 Loops, que corresponde a 6 produtos cadastrados e ainda repete todos os produtos. Pensei em pegar o valor do produto mostrado produto_mostrado= produtos("id") E no select não mostrar o produto
SQL = "SELECT *FROM Produtos where id_loja = "&id_loja&" and id <> " & produto_mostrado & " "

Mas a cada Loop ele esta mostrando 3 produtos, nesta tentativa..............

Não sei mais o que fazer, esta lógica de programação esta me matando!!

Link para o comentário
Compartilhar em outros sites

  • 0

Eu não entendi porque você fez um select dentro do outro, isso em questao de desempenho é muito ruim...

bom, seguindo a sua ideia o select seria desta forma:

select L.nome_loja, P.produto, P.preço, P.id from PRODUTOS P inner join Lojas L where L.id_loja = P.id_loja
para facilitar mais a tua vida (não acostuma hein rssss), segue:
<%

abredb  = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("database.mdb")

Set busca = Server.CreateObject("ADODB.Recordset")
SQL = "select L.nome_loja, P.produto, P.preço, P.id from PRODUTOS P inner join Lojas L where L.id_loja = P.id_loja"
busca.Open SQL, abredb, 1, 3

Do while not busca.Eof
%>
        Pruduto n° <% = produtos("id")%> - <% = produtos("produto")%> - <% = produtos("preço")%> - <% = lojas("nome_loja")%> <br />
        
<%
busca.Movenext
loop
%>

outra coisa, não use em nomes de campos/tabelas/variaveis ç e palavras acentuadas, como por exemplo preço, use c em vez de ç... blza?!

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Andreia,

Primeiramente obrigado por tentar me ajudar.

O caso de estar fazendo 2 selects , um dentro do outro, é o formato que desejo mostrar este resultado. na verdade já chegeui a fazer até 4 loops, um dentro do outro.. hehe

Da forma que me passou o resultado da busca aparece ordenada pelo nome das Lojas em seqüencia.

Pruduto n° 1 - Plays station - 650 - Americanas

Pruduto n° 2 - playstation 3 - 1800 - Americanas

Pruduto n° 4 - playstation 2 - 858 - Americanas

Pruduto n° 3 - playstation 3 - 1780 - ShopTime

Pruduto n° 5 - playstation - 652 - ShopTime

Pruduto n° 6 - Play - 550 - Submarino

Eu quero mostrar ordenando pelo nome das Lojas, mas alternando

Pruduto n° 1 - Plays station - 650 - Americanas

Pruduto n° 3 - playstation 3 - 1780 - ShopTime

Pruduto n° 6 - Play - 550 - Submarino

Pruduto n° 2 - playstation 3 - 1800 - Americanas

Pruduto n° 3 - playstation 3 - 1780 - ShopTime

Pruduto n° 4 - playstation 2 - 858 - Americanas

Pruduto n° 5 - playstation - 652 - ShopTime

Eu acho que só consigo fazer isso com vários Loops e If's, mas não consigo achar uma lógica que funcione.

Observe que existe uma seqüencia:

Loop 1:

Pego a primeira loja cadastrada na tabela LOJAS

Verifico na Tabela PRODUTOS se existe um produto cadastrado por esta loja

Se existir mostro, se não mudo para a proxima loja.

Pego a segunda loja cadastrada na tabela LOJAS

Verifico na Tabela PRODUTOS se existe um produto cadastrado por esta loja

Se existir mostro, se não mudo para a proxima loja.

Pego a terceira loja cadastrada na tabela LOJAS

Verifico na Tabela PRODUTOS se existe um produto cadastrado por esta loja

Se existir mostro, se não mudo para a proxima loja.

Loop 2:

Tenho que ter guardado os já produtos mostrados.

Pego novamente a primeira loja cadastrada na tabela LOJAS

Verifico na Tabela PRODUTOS se existe um segundo produto cadastrado por esta loja

Se existir mostro, se não mudo para a proxima loja.

Pego novamente a segunda loja cadastrada na tabela LOJAS

Verifico na Tabela PRODUTOS se existe um segundo produto cadastrado por esta loja

Se existir mostro, se não mudo para a proxima loja.

Pego novamente a terceira loja cadastrada na tabela LOJAS

Verifico na Tabela PRODUTOS se existe um segundo produto cadastrado por esta loja

Se existir mostro, se não mudo para a proxima loja.

Acho que é mais ou menos assim !!! Um pouco complicado

Mas eu sei que tem como fazer, pois o Buscapé e o Shopping UOL mostram seus produtos desta forma

http://compare.buscape.com.br/sony-playsta...slim.html?pos=1

Neste link você pode observar o que eu estou falando. Veja que os produtos são mostrados desta forma.

Nesta sessão do site deles é encontrado 8 lojas para este produtos e a partir do 8° produto mostrado, mostra o 2° produto de cada loja se houver. Veja que chega uma hora que só ficam intercalando entre duas lojas e no final apenas uma.

Bem, isso é de extrema importância para mim, pois estou desenvolvendo um site onde terá dezenas de lojas com os mesmos produtos. Se eu colocar Randomico, pode acontecer de mostrar na lista, 4 produtos de um, 1 produto do outro e depois 10 do outro. Se todos eles pagam um valor tenho que ter uma coerência de mostrar a lista de produtos e a melhor forma que achei, é a mesma que estes dois sites, a loja que se cadastrou primeiro mostra seu produto primeiro, a segunda mostra o segundo produto e assim vai.......

Bem, sei que é meio complicado entender e tenho certeza que é pior para desenvolver, mas se alguém tiver alguma idéia de como seria, já me ajudaria muito.

Obrigado Andreia e webdeveloper por se disporem a responder .

Douglas

Link para o comentário
Compartilhar em outros sites

  • 0

Douglas, vamos partir do script que eu te mandei... ele só não ficou na ordem aleatoria? de resto serviria?

porque se for só a ordem, podemos fazer um random pra que fique.

De qualquer forma, eu não vejo ainda necessidade de ter 4 selects / 4 loops. Tudo se baseia na forma mais certa de montar o select. Eu não sei qual a base de dados que você está usando mas se for um Sql Server, isso lhe dará mais oportunidades de melhorar a consulta

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Andreia,

O que você me envio, mostra os produtos, mas não na ordem que desejaria.

<%

abredb  = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("database.mdb")
Set busca = Server.CreateObject("ADODB.Recordset")

SQL = "SELECT Lojas.Codigo, Lojas.Nome_loja, Produtos.ID, Produtos.ID_Loja, Produtos.Produto, Produtos.preço FROM Produtos INNER JOIN Lojas ON Lojas.Codigo = Produtos.ID_Loja  "                                                                                 

busca.Open SQL, abredb, 1, 3

Do while not busca.Eof 


%>
    
        
        Pruduto n° <% = busca("id")%> - <% = busca("produto")%> - <% = busca("preço")%> - <% = busca("nome_loja")%> <br />
        
        
        
 <%

busca.Movenext
loop

%>
Como aparece a busca: Pruduto n° 1 - Plays station - 650 - Americanas Pruduto n° 2 - playstation 3 - 1800 - Americanas Pruduto n° 4 - playstation 2 - 858 - Americanas Pruduto n° 3 - playstation 3 - 1780 - ShopTime Pruduto n° 5 - playstation - 652 - ShopTime Pruduto n° 6 - Play - 550 - Submarino Se eu fizer um Random:
SQL = "SELECT Lojas.Codigo, Lojas.Nome_loja, Produtos.ID, Produtos.ID_Loja, Produtos.Produto, Produtos.preço FROM Produtos INNER JOIN Lojas ON Lojas.Codigo = Produtos.ID_Loja order by  RND(INT(NOW*Produtos.ID)-NOW*Produtos.ID)"
Apareceria assim: Pruduto n° 2 - playstation 3 - 1800 - Americanas Pruduto n° 5 - playstation - 652 - ShopTime Pruduto n° 6 - Play - 550 - Submarino Pruduto n° 1 - Plays station - 650 - Americanas Pruduto n° 4 - playstation 2 - 858 - Americanas Pruduto n° 3 - playstation 3 - 1780 - ShopTime Ou a cada atualização mudaria a ordem, mas veja que neste exemplo esta fora de ordem e eu não tenho controle do como esta sendo mostrado. Tentei também:
SQL = "SELECT Lojas.Codigo, Lojas.Nome_loja, Produtos.ID, Produtos.ID_Loja, Produtos.Produto, Produtos.preço FROM Produtos INNER JOIN Lojas ON Lojas.Codigo = Produtos.ID_Loja order by  RND(INT(NOW*Lojas.Codigo)-NOW*Produtos.ID)"
SQL = "SELECT Lojas.Codigo, Lojas.Nome_loja, Produtos.ID, Produtos.ID_Loja, Produtos.Produto, Produtos.preço FROM Produtos INNER JOIN Lojas ON Lojas.Codigo = Produtos.ID_Loja order by  RND(INT(NOW*Lojas.Codigo)-NOW*Lojas.Codigo)"

Mas por ser Randomico eu nunca terei controle de como aparecerá.

Estou utilizando Access

O sistema que o webdeveloper, também é randomico e eu não consegui adaptar para mostrar todos.

Link para o comentário
Compartilhar em outros sites

  • 0

você quer q fique em ordem de importante, tipo, cliente X pagou por mais destaque então vai estar em primeiro, cliente Y não pagou então fica entre os ultimos a serem exibidos, etc... ?

você tem em alguma parte do seu banco de dados, marcado quais são os clientes de maior importancia?

Link para o comentário
Compartilhar em outros sites

  • 0

Minha idéia seria a seguinte:

O cliente que se cadastrar primeiro mostra seus produtos primeiro

O segundo em segundo

O terceiro em terceiro

Mas vamos dizer que no Banco de dados de Lojas

temos a seguinte ordem de cadastramento:

1° Cliente a se cadastrar seja o X

2° Cliente a se cadastrar seja o Y

No banco de dados Produtos:

O cliente X cadastrou o produto Playstation

O cliente X cadastrou o produto Playstation 2

O Cliente Y Cadastrou o produto Playstation

Quando eu fizer uma Busca por Playstation

Meu resultado será:

1º Produto a ser mostrado é o do Cliente X, pois ele esta cadastrado em primeiro na tabela Lojas

2° Produto a ser mostrado é o do Cliente Y, pois ele esta cadastrado em Segundo na tabela Lojas

Como eu só tenho 2 clientes cadastrados, acabou a lista de Clientes então verifico se há mais produtos, se houver, mostro novamente na ordem de clientes cadastrados.

Vou tentar descrever uma forma que estava tentando resolver, mas não consegui:

Primeiro faço um

Select from Lojas

Do While

Pego a primeira Loja e dentro deste Loop eu mostro o primeiro produto desta loja

Select from Produtos where ID_Loja = Codigo

Loop

Desta forma eu mostraria o primeiro produto da loja X e depois da Loja X

Terminando isso eu teria que fazer um nova busca para pegar o segundo produto a loja X e depois da Loja Y

O que me travou foi como guardar estes valores já mostrados para não mostrar novamente! Alguma idéia?

Link para o comentário
Compartilhar em outros sites

  • 0

Apesar de ser prejudicial ter vários Selects como você disse eu concordar, veja este código:

<%
abredb  = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("database.mdb")

Set busca = Server.CreateObject("ADODB.Recordset")
SQL = "SELECT *FROM Lojas " ' Faço a busca na Tabela Lojas e mostro em ordem de cadastramento
busca.Open SQL, abredb, 1, 3

Do while not busca.Eof ' Enquanto não acabar a lista de lojas

            
            id_loja = busca("codigo") ' Pego o Codigo da Loja na Tabela Lojas
            
            Set produtos = Server.CreateObject("ADODB.Recordset")
            ' Faço a busca na Tabela Produtos por um produto cadastrado pela loja
            SQL = "SELECT *FROM Produtos where id_loja = "&id_loja&" " 
            produtos.Open SQL, abredb, 1, 3
            if not produtos.eof then
        
            %>
                Pruduto n°        <% = produtos("id")%> - <% = produtos("produto")%> - <% = produtos("preço")%> - <% = busca("nome_loja")%> <br />
            
            <% 
                end if 
busca.Movenext
loop
%>

Resultado:

Pruduto n° 1 - Plays station - 650 - Americanas

Pruduto n° 3 - playstation 3 - 1780 - ShopTime

Pruduto n° 6 - Play - 550 - Submarino

O que eu teria que fazer agora seria um outro Loop para pegar a primeira loja novamente e mostrar o segundo produto se houver

Link para o comentário
Compartilhar em outros sites

  • 0

Se eu buscar por data de cadastro, se uma loja se cadastrar Hoje e postar 1000 produtos e amanhã um outra se cadastrar e postar 2 produtos, vou mostrar primeiro os 1000 da loja 1 e somente depois os dois da loja 2

Neste caso eu queria mostrar assim

Produto 1 da loja 1

Produto 1 da loja 2

Produto 2 da loja 1

Produto 2 da loja 2

produto 3 da loja 1

produto 4 da loja 1 -------> Não há mais produtos para loja 2

......

produto 100 da loja 1

Como seria o uso de Case para resolver este problema?

Editado por douglasdamame
Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado Urso louco, mas esta opção já tentamos.....

Andreia, se eu mudasse para o Mysql, seria mais fácil acharmos uma solução??

Realmente não tem Case para o Access, apenas o IIF, mas acho que não resolveria.

Se houver uma solução eu mudo todo o BD para MySql, se não houver, ai vou desistir e vou ter que utilizar Random mesmo...

Obrigado

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...