Pergunta

Eu sei que há alguns pós aqui sobre a seleção de registros até que um certo número for atendida a partir da soma de um campo, mas não há qualquer que ternos mim. Eu estou usando PHP e MySQL.

Eu tenho uma tabela chamada quantidade. Dentro, há registros de nome do produto, o preço do produto e quantidade do produto. Além destes, existem alguns outros que me ajuda a selecionar os últimos registros com base na data e posição, aswell como um GROUP BY o preço de campo chamado porque existem diferentes quantidades com preços diferentes para o mesmo produto. Então, eu atualmente seleccionar o meu preço específico do produto e quantidade como esta:

SELECT `price`,`quantity` FROM (SELECT `price`,`quantity` FROM `quantity` WHERE `product_name` = 'DELL' ORDER BY `date` DESC, `position`) AS `Actions` GROUP BY `price`

Esta consulta é uma solução porque eu preciso para obter dados como este:

product_name   |    price  |    quantity

DELL           |     100   |      30
DELL           |     120   |      10
DELL           |     130   |      2

asuming que eu tenho vários registros como estes e eu preciso para obter a última delas. De qualquer forma, a partir desta consulta que eu preciso fazer o seguinte: eu preciso selecionar os registros que está quantidade somada com a quantidade de outro produto é igual a 35. Assim, usando minha consulta eu sei que ele deve parar na linha 2, porque eu posso tomar as 30 produtos que veio com o preço de US $ 100 e mais 5 produtos a partir da linha 2 que tem preço de 120. e então eu precisaria entrar minhas atualizações. Assim, os novos dados seria parecido com:

product_name   |    price  |    quantity

DELL           |     100   |      0
DELL           |     120   |      5
DELL           |     130   |      2

Como no mundo é que eu vou conseguir isso? Espero que os meus dados são claros. Por favor, pergunte a qualquer pergunta.

Obrigado pelo seu tempo!

Foi útil?

Solução

Opção 1: Use a lógica do programa em vez de uma consulta:

Não há nada de errado em usar a camada de programação para fazer as interações de banco de dados mais avançadas. SQL não é uma resposta para tudo ... (Considere também um procedimento armazenado).

enough = 35
running_total = 0

START TRANSACTION
while running_total < enough:
    select one record order by price limit 1 FOR UPDATE
    add to running_total

UPDATE records...
COMMIT

Opção 2: Use uma consulta com um total de execução:

Nesta opção, você obter um total de execução usando uma consulta derivada, e depois filtrar esse baixo para registros específicos na consulta externa. Se você pretende atualizá-los, você deve envolver este em uma transação com o nível de isolamento direita.

SET @running_total = 0;
SELECT
    row_id,
    product_name,
    price,
    quantity
FROM
    (
    SELECT 
        row_id, 
        product_name, 
        price, 
        quantity, 
        @running_total := @running_total + quantity AS running_total
    FROM 
        sometable
    WHERE
        quantity > 0
    ORDER BY
        quantity
    LIMIT 
        35  /* for performance reasons :) */
    ) as T1
WHERE
    running_total < 35

Eu tendem a preferir a opção 1 porque é mais "óbvio", mas talvez isso vai lhe dar algum alimento para o pensamento.

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