Pergunta

Estou usando o MySQL e PHP. Eu tenho uma tabela que contém o ID e quantidade colunas. Eu gostaria de recuperar o ID da linha que é a última a somar quantidade, uma vez que atinge o número 40 na soma. Para ser mais específico. Eu tenho 3 linhas no banco de dados. Uma com a quantidade 10, um com quantidade 30 e outro com quantidade 20. Então, se eu somar as quantidades para ter o resultado 40, gostaria de resumir os dois primeiros meios de bruxas: 10 + 30 = 40. Dessa forma, o último ID que é utilizado para somar o número 40 é 2. Eu só quero saber o ID da última linha que é usada para completar a soma de 40.

Eu daria mais detalhes, se perguntou. OBRIGADO !!


Deixe-me colocar desta forma: Eu realmente tenho 6 produtos em minha mão. O primeiro veio a minha posse na data de 10, o próximo 3 veio na data de 11 eo último 2 veio em 12.

Agora, eu quero vender 3 produtos do meu estoque. E quer vendê-los na ordem em que eles vieram. Assim, para o cliente que quer 3 produtos Eu o venderia o produto que veio em 10 e 2 produtos daqueles que vieram em 11.

Para o próximo cliente que quer 2 produtos, gostaria de vendê-lo um produto a partir da data de 11 de que os restos do último fim de 3 produtos, e outro daqueles em 12.

A questão é como eu ia saber que o preço tinha cada produto vendi? Eu pensei que se eu posso descobrir quais linhas resume cada quantidade pedida, eu gostaria de saber por onde começar a soma cada vez que deseja entregar uma encomenda. Então, primeiro eu iria procurar quais linhas resume 3 produtos e manter o ID de entrada. Para o próximo fim eu iria começar a contagem a partir desse ID e soma até que resume a segunda ordem de 2 produtos e assim por diante. Pensei que desta forma, eu posso manter o controle dos preços de entrada que cada produto tinha. Então eu não vou vender os produtos a partir da data de 12 de por um preço compo usando os primeiros preços.

Espero que você entenda. Eu só preciso saber o preço teve alguns de meus produtos, então eu saberia que os primeiros produtos teria um preço, mas como os preços de produtos raises, devo criar meus preços também ... Então, os últimos produtos que vieram deve ser vendido por um preço mais elevado. Eu só pode conseguir isso se eu acompanhar esse ...

Muito obrigado.


Ninguém? Ou, ainda mais fácil: MySQL deve selecionar as linhas necessárias para SUM (quantity) a ser maior ou igual a 40, por exemplo. E, em seguida, para obter me o ID da última linha que participou no processo de soma.

Foi útil?

Solução

Eu não entendo a sua pergunta muito bem. Você pode tentar a reformulação-lo mais corretamente? Pelo que eu interpreto, aqui é a estrutura do seu banco de dados:

ProductID    ArrivalDate
   1          10
   2          11
   3          11
   4          11
   5          12
   6          12

Agora você está perguntando, "como eu saberia que preço tinha cada produto que eu vendi"? Que sorta me confunde, uma vez que cada valor no banco de dados tem nenhum atributo preço. Não deve o seu olhar de banco de dados como este:

ProductID    ArrivalDate    Price
   1          10              100
   2          11              200
   3          11              300
   4          11              300
   5          12              400
   6          12              400

Pessoalmente, acho que sua idéia para descobrir o preço de venda é falho. Não faria mais sentido adicionar mais alguns campos para seu banco de dados:

ProductID    ArrivalDate    Price     InStock   DateSold
   1          10              100       Yes        17
   2          11              200       Yes        17
   3          11              300       Yes        18
   4          11              300       Yes        18
   5          12              400       no        
   6          12              400       no        

Ao mudar seu banco de dados, você pode facilmente manter o controle de quando um produto chega, a data de venda, o seu preço, talvez a quantidade (Eu não posso dizer se é um campo real ou não).

Além disso, você pode simplificar e facilitar a sua vida, separando as consultas SQL, ou mesmo adicionando algum código para fazer parte do trabalho para você.

Outras dicas

Tenha uma terceira coluna com um total de execução. Então você pode simplesmente retornar a última linha onde a execução total <= o valor-alvo.

Assim sua tabela deve ser semelhante a:

ID    Quantity    RunningTotal
1           10              10
2           30              40
3           20              60

NOTA: Se você excluir uma linha na tabela, lembre-se de atualizar todos os posteriores linhas RunningTotal -= DeletedRow.Quantity

Baseando-se no ID da tabela é provavelmente uma má idéia para isso, mas se é assim que é realmente feito, você poderia tentar algo como isto (não testado):

SELECT yourTableA.id
  FROM yourTable AS yourTableA
  JOIN yourTable AS yourTableB
 WHERE ( yourTableA.value + yourTableB.value ) = 40
   AND yourTableA.id != yourTableB.id
 ORDER BY yourTableA.id

Este tipo de solução só funcionará se o seu esperando que você só precisa de duas linhas que nunca para igualar a sua soma alvo. Uma vez que este é mais provável não é o caso, sua melhor aposta é provavelmente para tentar obter todas as linhas e fazer isso programaticly sobre os dados retornados.

A solução total em execução postado por lc também é uma boa opção, embora eu geralmente tentam evitar o armazenamento de dados calculados a menos que seja absolutamente necessário.


Com base nas informações atualizadas a partir deste pedido, eu tenho uma resposta alternativa.

Ele não soa tão bem como você se preocupa com o inventário. Você se importa mais sobre quando os produtos entraram.

SELECT *
  FROM product
 ORDER BY product.receivedData

Processo cada registro como eles vêm, armazenar o preço para esse registro, e continuar durante o tempo que você precisa até alcançar o número de itens que você precisa. Você deve acabar com uma lista de itens, o número de inventário a esse nível e o preço a esse nível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top