使用mysql查询检索所有“子”项

xjreopfe  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(316)

我正试图编写一个sql查询来生成一个表,其中包含每个“父”的所有“子”项(在本例中是元素)。
为了清晰起见,我在下面创建了这个问题的一个简化示例,并设置了一个db fiddle示例。
给定以下虚拟数据:

-- -----------------------------------------------------
-- Table `Element`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Element` (
  `idElement` INT NOT NULL AUTO_INCREMENT,
  `Element_Name` VARCHAR(45) NULL,
  PRIMARY KEY (`idElement`))
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `Property`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Property` 
(
    `idProperty` INT NOT NULL AUTO_INCREMENT,
    `Property_Text` VARCHAR(45) NULL,
    `Property_Node_ID` INT NULL,
    `Element_idElement` INT NOT NULL,
    PRIMARY KEY (`idProperty`),
    INDEX `fk_Property_Element1_idx` (`Element_idElement` ASC),
    CONSTRAINT `fk_Property_Element1`
        FOREIGN KEY (`Element_idElement`)
        REFERENCES `Element` (`idElement`)
)
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `Property_2`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Property_2` 
(
    `idProperty_2` INT NOT NULL AUTO_INCREMENT,
    `Property_2_Text` VARCHAR(45) NULL,
    `Property_Node_ID` INT NULL,
    `Element_idElement` INT NOT NULL,
    PRIMARY KEY (`idProperty_2`),
    INDEX `fk_Property_2_Element_idx` (`Element_idElement` ASC),
    CONSTRAINT `fk_Property_2_Element`
         FOREIGN KEY (`Element_idElement`)
         REFERENCES `Element` (`idElement`)
)
ENGINE = InnoDB;

INSERT INTO `Element` (`idElement`, `Element_Name`) 
VALUES (NULL, 'element_1');
INSERT INTO `Element` (`idElement`, `Element_Name`) 
VALUES (NULL, 'element_2');

INSERT INTO `Property` (`idProperty`, `Property_Text`, `Property_Node_ID`, `Element_idElement`) 
VALUES (NULL, 'property_a', NULL, '1');
INSERT INTO `Property` (`idProperty`, `Property_Text`, `Property_Node_ID`, `Element_idElement`) 
VALUES (NULL, 'property_b', NULL, '1');                          
INSERT INTO `Property` (`idProperty`, `Property_Text`, `Property_Node_ID`, `Element_idElement`) 
VALUES (NULL, 'property_c', NULL, '2');                              
INSERT INTO `Property_2` (`idProperty_2`, `Property_2_Text`, `Property_Node_ID`, `Element_idElement`) 
VALUES (NULL, 'property_2_a', NULL, '1');
INSERT INTO `Property_2` (`idProperty_2`, `Property_2_Text`, `Property_Node_ID`, `Element_idElement`) 
VALUES (NULL, 'property_2_b', NULL, '2');
INSERT INTO `Property_2` (`idProperty_2`, `Property_2_Text`, `Property_Node_ID`, `Element_idElement`) 
VALUES (NULL, 'property_2_c', NULL, '2');

我想输出以下内容,其中元素及其属性的每个唯一组合将逐行显示。
它们首先按元素排序,然后按第一个属性排序,最后按最后一个属性排序:

-------------------------------------
element   | property   | property_2
-------------------------------------
element_1 | property_a | property_2_a
element_1 | property_b | property_2_a
element_2 | property_c | property_2_b
element_2 | property_c | property_2_c


请参见db小提琴的链接:https://www.db-fiddle.com/f/csqtvjfttpodqpksqtyrbs/0. 如有任何帮助,我们将不胜感激?

yvgpqqbh

yvgpqqbh1#

我真的不明白这个问题-命名策略让人困惑-但是下面的哪一部分没有解决?

SELECT e.Element_Name element
     , p.Property_text property
     , p2.Property_2_text property_2
  FROM Element e
  JOIN Property p
    ON p.Element_idElement = e.idElement
  JOIN Property_2 p2
    ON p2.Element_idElement = e.idElement
 ORDER
    BY element
     , property
     , property_2;

相关问题