Merge Multiple date ranges in SQL

WITH ftable as  (
SELECT * FROM faults
WHERE 
stop > CAST('2022-04-11' AS DATETIME) AND start < CAST('2022-05-17' AS DATETIME)
)
WITH ftable as  (
SELECT start, IFNULL(stop,NOW()) as stop FROM faults
WHERE 
(stop > CAST('2022-04-11' AS DATETIME) 
-- If you need with not-ending uncomment this 2 lines
-- OR stop is NULL
) AND start < CAST('2022-05-17' AS DATETIME)
)

SELECT  GREATEST(s1.start, CAST('2022-04-11' AS DATETIME)) as start,
   LEAST(min(t1.stop),CAST('2022-05-17' AS DATETIME)) as stop
FROM ftable s1 
INNER JOIN ftable t1 ON s1.start<= IFNULL(t1.stop, NOW())
  AND NOT EXISTS(SELECT * FROM ftable t2 
                 WHERE IFNULL(t1.stop, NOW()) >= t2.start AND IFNULL(t1.stop, NOW()) < IFNULL(t2.stop, NOW())) 
WHERE NOT EXISTS(SELECT * FROM ftable s2 
                 WHERE s1.start> s2.start AND s1.start<= IFNULL(s2.stop, NOW()))
GROUP BY s1.start
ORDER BY s1.start 

Korlátlan kategória mélység

Tábla tartalmaz egy 0-val paddingolt ordered oszlopot, mely vesszővel elválasztva mutatja az utat a gyerekig.

Beszúrásnál átveszi a szülő ordered mezőjét és hozzá bigyeszti saját id-jét.

Előnye eszerint lehet rendezni. Illetve ez az sql megadja a mélység szintjét.

Valamint alul egy lekérdezés, mely legyűjti az összes gyermek terméket.

 LENGTH(c.ordered) - LENGTH(REPLACE(c.ordered, ',', '')) AS depth
CREATE TABLE IF NOT EXISTS `category` (
  `cat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `cat_name` varchar(64) COLLATE utf8_hungarian_ci NOT NULL,
  `parent_id` int(10) unsigned DEFAULT NULL,
  `ordered` varchar(255) COLLATE utf8_hungarian_ci DEFAULT NULL,
  `cat_color` int(10) unsigned NOT NULL,
  PRIMARY KEY (`cat_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci AUTO_INCREMENT=43 ;

 

Az új kategória beszúrása:

if($_POST['cat'] == "") { 
               //main category
                $sql = "INSERT INTO category (cat_name, parent_id, cat_color)
                        VALUES ('".$name."', 0,'".$_POST['color']."')";
                mysql_query($sql) or die ("Nem sikerült új kategória hozzáadása!");

                print_r($sql);

                $last_idd = mysql_insert_id();
                $padding_lastid = str_pad("$last_idd", 4, "0", str_pad_left);

                $sql3 = "UPDATE category 
                         SET ordered = '".$padding_lastid."'
                         WHERE cat_id = ".$last_idd;
                $result3 = mysql_query($sql3) or die ("Update problem!".$last_idd);

                print_r($sql3);
            }

            else { 

                //sub category
                $sql2 = "SELECT *
                         FROM category
                         WHERE cat_id = ".$_POST['cat']; 
                $result2 = mysql_query($sql2);

                $row2 = mysql_fetch_assoc($result2);
                $ordered = $row2['ordered'];

                $sql = "INSERT INTO category (cat_name, parent_id)
                        VALUES ('".$name."', '".$_POST['cat']."')";
                mysql_query($sql) or die ("Nem sikerült új kategória hozzáadása!");

                $last_idd = mysql_insert_id();

                $padding_lastid = str_pad("$last_idd", 4, "0", str_pad_left);

                $sql3 = "UPDATE category 
                         SET ordered='".$ordered.",".$padding_lastid."' 
                         WHERE cat_id=".$last_idd;
                $result3 = mysql_query($sql3) or die ("Update problem!".$ordered);
            }
SELECT coalesce(c2.cat_name,'-') AS parent_name, 
            c.cat_name AS child_name, 
            c.cat_id, c.ordered, color.col_class, 
            LENGTH(c.ordered) - LENGTH(REPLACE(c.ordered, ',', '')) AS occurence
            FROM category c
            LEFT JOIN category c2
            on c.parent_id=c2.cat_id
            LEFT JOIN color
            ON c.cat_color = color.col_id
            ORDER BY ordered ASC;

Az alábbi bekezdés pedig legyűjti a szülő gyerek kapcsolatokat 2 oszlopos formátumban.

//sub category         
    $sql2 = "SELECT getChildLst(".$cat_id.") AS cat_list";
    $result2 = mysql_query($sql2);
    $row2 = mysql_fetch_assoc($result2);
    $cat_idd .= $row2['cat_list'];

    //products
    $sql = "SELECT *
            FROM product
            INNER JOIN prod_cat
            ON product.pro_id = prod_cat.pro_id
            INNER JOIN price
            ON product.pro_id = price.pro_id
            WHERE cat_id IN (".$cat_idd.")";

 

És a getChildLst függvény mint tárolt függvény.

DROP FUNCTION `getChildLst`//
CREATE  FUNCTION `getChildLst`(rootId INT) RETURNS varchar(1000) CHARSET latin1
    DETERMINISTIC
BEGIN
 DECLARE Stemp VARCHAR (1000);
 DECLARE sTempChd VARCHAR (1000);
 DECLARE checkChd VARCHAR (1000);

 SET sTemp = '$';
 SET sTempChd = cast(rootId as CHAR);

 SET checkChd = cast(rootId as CHAR);

 WHILE sTempChd is not null DO

         IF( sTempChd != checkChd) THEN
          SET sTemp = concat(sTemp, ',', sTempChd);
         ELSE
              SET sTemp = sTempChd;
         END IF;

     SELECT group_concat(cat_id) INTO sTempChd FROM category where FIND_IN_SET(parent_id, sTempChd)> 0;

 END while;
 RETURN sTemp;
 END