Selecione a partir do MySQL registros que somas
-
03-07-2019 - |
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!
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.