簡體   English   中英

嵌套SELECT + INNER JOIN

[英]Nested SELECT + INNER JOIN

第一桌

  CREATE TABLE IF NOT EXISTS `city_node` (
 `node_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `title` varchar(50) NOT NULL,
 `parent_node_id` int(10) unsigned NOT NULL DEFAULT '0',
 `lft` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Nested set info ''left'' value',
 `rgt` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Nested set info ''right'' value',
 `depth` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Depth = 0: no parent',
 PRIMARY KEY (`node_id`),
 KEY `parent_node_id` (`parent_node_id`),
 KEY `lft` (`lft`)) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=26;

和數據

INSERT INTO `city_node` (`node_id`, `title`, `parent_node_id`, `lft`, `rgt`, `depth`) VALUES
(1, 'Great Britain', 0, 1, 20, 0),
(3, 'England', 1, 2, 9, 1),
(7, 'Scotland', 1, 16, 19, 1),
(8, 'Edinburgh', 7, 17, 18, 2),
(9, 'Wales', 1, 10, 15, 1),
(10, 'Cardiff', 9, 11, 12, 2),
(11, 'London', 3, 3, 4, 2),
(12, 'Birmingham', 3, 5, 6, 2),
(13, 'Germany', 0, 21, 26, 0),
(14, 'Stuttgart', 13, 22, 23, 1),
(15, 'Newport', 9, 13, 14, 2),
(16, 'Munich', 13, 24, 25, 1),
(17, 'Israel', 0, 27, 32, 0),
(18, 'Tel Aviv', 17, 28, 29, 1),
(19, 'Ashdod', 17, 30, 31, 1),
(20, 'USA', 0, 33, 38, 0),
(21, 'New York', 20, 34, 35, 1),
(24, 'Liverpool', 3, 7, 8, 2),
(25, 'Detroit', 20, 36, 37, 1);

第二張桌子

CREATE TABLE IF NOT EXISTS `city_node_entity` (
  `node_id` int(10) NOT NULL,
  `entity` tinyint(3) unsigned NOT NULL DEFAULT '1',
  KEY `node_id` (`node_id`,`entity`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

和數據

INSERT INTO `city_node_entity` (`node_id`, `entity`) VALUES
(11, 1),
(12, 1),
(16, 1),
(19, 1);

我想獲得帶有實體1及其祖先的節點

大不列顛
- 英國
- - 倫敦
----伯明翰
德國
- 慕尼黑
以色列
-阿什杜德

所以,我的查詢是

SELECT DISTINCT(node_ext.node_id), node_ext.*
FROM city_node_entity AS entity
LEFT JOIN city_node AS node 
    ON entity.node_id = node.node_id 
LEFT JOIN city_node AS node_ext 
    ON node_ext.lft <= node.lft AND node_ext.rgt >= node.rgt
WHERE entity.entity = 1
ORDER BY node_ext.lft

但是說明一下-在哪里使用; 使用索引; 使用臨時; 使用文件排序

是否還有其他查詢可以獲得相同的結果,但[EXTRA]較少?

對於遞歸查詢,您唯一可以做的就是對每個父母/孩子使用聯接來運行它。...因為您的第二張表是實際的城市名稱,並且您想向后工作,您可以像這樣進行操作...只需添加更多聯接直到所有結果為空,您將擁有完整的樹

SELECT node.title AS child, t2.title as parent1, t3.title as parent2, t4.title as parent3
FROM city_node_entity AS entity
LEFT JOIN city_node AS node ON entity.node_id = node.node_id 
LEFT JOIN city_node AS t2 ON t2.node_id = node.parent_node_id
LEFT JOIN city_node AS t3 ON t3.node_id = t2.parent_node_id
LEFT JOIN city_node AS t4 ON t4.node_id = t3.parent_node_id;

小提琴演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM