문제

특정 숫자가 한 필드의 합에서 충족 될 때까지 레코드를 선택하는 것에 대한 게시물이 몇 개 있다는 것을 알고 있지만 나에게 적합한 것은 없습니다. PHP와 MySQL을 사용하고 있습니다.

수량이라는 테이블이 있습니다. 내부에는 제품 이름, 제품 가격 및 제품 수량에 대한 기록이 있습니다. 이 외에도 날짜와 위치를 기준으로 마지막 레코드를 선택하는 데 도움이되는 몇 가지가 있습니다. 동일한 제품에 대해 가격이 다른 수량이 있기 때문에 가격이라는 필드별로 그룹으로 well이 있습니다. 그래서 저는 현재 제품 별 가격과 수량을 선택합니다.

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

이 쿼리는 다음과 같은 데이터를 가져와야하기 때문에 해결 방법입니다.

product_name   |    price  |    quantity

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

이와 같은 여러 레코드가 있고 최신 레코드를 가져야한다는 것을 알 수 있습니다. 어쨌든,이 쿼리에서 나는 다음을 수행해야합니다. 다른 제품의 수량으로 합산 한 수량의 레코드를 선택해야합니다. 따라서 쿼리를 사용하면 30 제품을 사용하여 2 행에서 중지해야한다는 것을 알고 있습니다. 그 가격은 $ 100의 가격과 Line 2의 가격이 120 인 5 개의 제품과 함께 제공되었습니다. 그런 다음 업데이트를 입력해야합니다. 따라서 새로운 데이터는 다음과 같습니다.

product_name   |    price  |    quantity

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

세상에서 나는 이것을 어떻게 달성 할 것인가? 내 세부 사항이 명확하기를 바랍니다. 질문을 해주세요.

시간 내 주셔서 감사합니다!

도움이 되었습니까?

해결책

옵션 1 : 쿼리 대신 프로그램 로직 사용 :

프로그래밍 계층을 사용하여보다 고급 데이터베이스 상호 작용을 수행하는 데 아무런 문제가 없습니다. SQL은 모든 것에 대한 답이 아닙니다 ... (또한 저장된 절차를 고려하십시오).

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

옵션 2 : 실행중인 쿼리 사용 :

이 옵션에서는 파생 된 쿼리를 사용하여 실행중인 총액을 얻은 다음 외부 쿼리의 특정 레코드로 필터링합니다. 업데이트하려는 경우 올바른 격리 수준으로 거래에서이를 래핑해야합니다.

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

나는 옵션 1을 선호하는 경향이 있지만 "명백한"것이기 때문에 아마도 이것은 당신에게 생각할 음식을 줄 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top