programing

해당 자식의 가능한 SUM이 하나 이상 주어진 숫자와 같을 경우 행을 선택하시겠습니까?

linuxpc 2023. 8. 9. 20:33
반응형

해당 자식의 가능한 SUM이 하나 이상 주어진 숫자와 같을 경우 행을 선택하시겠습니까?

저는 건물이 가진 가능한 모든 표면을 계산한 다음 그것이 제 기준과 일치하는지 여부를 확인하여 아파트 세트를 필터링하려고 합니다.

예: 저는 각각 200m²의 3개의 아파트로 구성된 A 건물이 하나 있는데, 그들을 1, 2, 3이라고 이름 붙입니다.

제가 조사한 바로는, 제 기준이 다음과 같은 경우를 충족한다면, 저는 그 건물을 회수할 수 있을 것입니다.

  • 200m²(이 기준에 맞는 아파트가 3개 있습니다)를 찾고 있습니다.
  • 저는 400m²를 찾고 있습니다(1+2, 1+3, 2+3 상관없이 건물 내에 일치할 수 있는 표면 합계가 몇 개 있습니다).
  • 저는 600m²를 찾고 있습니다(건물의 모든 표면의 SUM을 가지고 있습니다, 1+2+3).

첫 번째 사례에 대해 MIN()으로 답변할 수 있으므로 가능한 최소 표면을 얻을 수 있습니다.저는 또한 모든 아파트의 SUM()으로 가능한 최대 가용 표면을 얻을 수 있기 때문에 마지막 사례에 답변할 수 있습니다.

하지만 두 번째 사례는 제가 "가능한 SUMS"를 쿼리 내에서 계산할 수 있는지 모르겠습니다.

다음은 두 번째 사례에 대한 답변이 아니라는 것을 잘 알고 있는 SQL입니다.

SELECT DISTINCT building.* 
FROM building AS building   
    LEFT JOIN appartment a ON a.id_building = building.id 
WHERE (
        SELECT MIN(a2.surface) 
        FROM appartment a2 
            INNER JOIN building ON a2.id_building= building.id 
      ) >= 399
AND (
        SELECT SUM(a2.surface) 
        FROM appartment a2 
            INNER JOIN building ON lot.id_building= building.id 
    ) <= 401

SQL보다는 PHP로 전체 결과 집합을 작업하려고 했지만, 제가 하지 않은 많은 작업을 다시 수행하는 것을 의미하기 때문에 선호하는 옵션이 아닙니다. 그래서 빠르게 어려워졌습니다.진술서를 가지고 있다는 것에 대해서도 읽었는데 어디에 넣어야 하는지 안에 어떤 조건이 있어야 하는지 이해가 안 됩니다.

이런 것일 수도 있지만, 당신의 테이블 구조에 대해서는 잘 모르겠습니다.

    SET @totalSurface= 0;
    SELECT @totalSurface:=@totalSurface+`surface`, `id`, `building` FROM `apartment`
    WHERE @totalSurface=400
    GROUP BY `building` ;

저장된 기능을 사용하여 마침내 무언가를 찾을 수 있었습니다.건물 ID가 있는 이 커서를 매개 변수로 사용하여 지표면별로 정렬된 해당 건물의 모든 구획을 순환합니다.그런 다음 각 루프에 대해 지표면을 합계에 추가하고 주어진 기준 간격에 있는지 확인합니다.예인 경우 반환 값을 true로 설정하고 그렇지 않은 경우 반환 값은 false로 유지됩니다.

여기 있습니다. 저는 누군가가 저처럼 갇혀있다면 도움이 되길 바랍니다.

CREATE DEFINER=`homestead`@`%` FUNCTION `buildingHasSurface`(`surface_min` INT, `surface_max` INT, `building_id` INT) RETURNS TINYINT(1)
BEGIN
  DECLARE curseurFini INT;
  DECLARE valide INT;

  DECLARE surface_totale INT;
  DECLARE surface_row INT;

  DECLARE curs CURSOR FOR SELECT surface_dispo FROM appartement WHERE id_building = building_id ORDER BY surface_dispo ASC;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET curseurFini = 1;

  OPEN curs;

  SET curseurFini = 0;
  SET surface_totale = 0;
  SET valide = 0;
  
  REPEAT
    FETCH curs INTO surface_row;
      IF curseurFini = 0 THEN
        SET surface_totale = surface_totale + surface_row;
        IF surface_totale >= surface_min 
        AND surface_totale <= surface_max
        THEN 
        SET valide = 1;
      END IF;
    END IF;
  UNTIL curseurFini END REPEAT;

  CLOSE curs;





  RETURN valide;
END$$

언급URL : https://stackoverflow.com/questions/74457653/select-row-if-at-least-one-possible-sum-of-its-children-equal-a-given-number

반응형