CREATE TABLE taxonomy ( id INT UNSIGNED NOT NULL PRIMARY KEY, name VARCHAR(255) NOT NULL ); CREATE TABLE taxonomy_graph ( latch SMALLINT UNSIGNED NULL, origid BIGINT UNSIGNED NULL, destid BIGINT UNSIGNED NULL, weight DOUBLE NULL, seq BIGINT UNSIGNED NULL, linkid BIGINT UNSIGNED NULL, KEY (latch, origid, destid) USING HASH, KEY (latch, destid, origid) USING HASH ) ENGINE=OQGRAPH; INSERT INTO taxonomy VALUES (1, "Animalia"), (2, "Chordata"), (3, "Vertebrata"), (4, "Mammalia"), (5, "Porifera"), (6, "Calcarea"), (7, "Demospongiae"), (8, "Hexactinellida"); INSERT INTO taxonomy_graph (origid,destid) VALUES (4,3), (3,2), (2,1), (8,5), (7,5), (6,5), (5,1); MariaDB [test]> SELECT * FROM taxonomy LEFT JOIN taxonomy_graph ON id = destid WHERE destid IS NULL; -- Selects "leaf" nodes (nodes that nothing else points to) +----+----------------+-------+--------+--------+--------+------+--------+ | id | name | latch | origid | destid | weight | seq | linkid | +----+----------------+-------+--------+--------+--------+------+--------+ | 4 | Mammalia | NULL | NULL | NULL | NULL | NULL | NULL | | 6 | Calcarea | NULL | NULL | NULL | NULL | NULL | NULL | | 7 | Demospongiae | NULL | NULL | NULL | NULL | NULL | NULL | | 8 | Hexactinellida | NULL | NULL | NULL | NULL | NULL | NULL | +----+----------------+-------+--------+--------+--------+------+--------+ 4 rows in set (0.00 sec) MariaDB [test]> SELECT GROUP_CONCAT(name ORDER BY seq DESC SEPARATOR " > ") AS Path FROM taxonomy JOIN taxonomy_graph ON id=linkid WHERE latch=2 AND destid=1 AND origid IN (4,6,7,8) GROUP BY origid; +---------------------------------------------+ | Path | +---------------------------------------------+ | Animalia > Chordata > Vertebrata > Mammalia | | Animalia > Porifera > Calcarea | | Animalia > Porifera > Demospongiae | | Animalia > Porifera > Hexactinellida | +---------------------------------------------+ 4 rows in set (0.01 sec) MariaDB [test]> SELECT GROUP_CONCAT(name ORDER BY seq DESC SEPARATOR " > ") AS Path FROM taxonomy JOIN taxonomy_graph ON id=linkid WHERE latch=2 AND destid=1 AND origid IN (SELECT id FROM taxonomy LEFT JOIN taxonomy_graph ON id = destid WHERE destid IS NULL) GROUP BY origid; Empty set (0.00 sec) MariaDB [test]> EXPLAIN EXTENDED SELECT GROUP_CONCAT(name ORDER BY seq DESC SEPARATOR " > ") AS Path FROM taxonomy JOIN taxonomy_graph ON id=linkid WHERE latch=2 AND destid=1 AND origid IN (4,6,7,8) GROUP BY origid; +----+-------------+----------------+--------+---------------+---------+---------+----------------------------+------+----------+-----------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------------+--------+---------------+---------+---------+----------------------------+------+----------+-----------------------------+ | 1 | SIMPLE | taxonomy_graph | range | latch,latch_2 | latch | 21 | NULL | 12 | 75.00 | Using where; Using filesort | | 1 | SIMPLE | taxonomy | eq_ref | PRIMARY | PRIMARY | 4 | test.taxonomy_graph.linkid | 1 | 100.00 | Using where | +----+-------------+----------------+--------+---------------+---------+---------+----------------------------+------+----------+-----------------------------+ 2 rows in set, 1 warning (0.00 sec) MariaDB [test]> EXPLAIN EXTENDED SELECT GROUP_CONCAT(name ORDER BY seq DESC SEPARATOR " > ") AS Path FROM taxonomy JOIN taxonomy_graph ON id=linkid WHERE latch=2 AND destid=1 AND origid IN (SELECT id FROM taxonomy LEFT JOIN taxonomy_graph ON id = destid WHERE destid IS NULL) GROUP BY origid; +----+--------------------+----------------+--------+---------------+---------+---------+----------------------------+------+----------+-----------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+--------------------+----------------+--------+---------------+---------+---------+----------------------------+------+----------+-----------------------------+ | 1 | PRIMARY | taxonomy_graph | range | latch,latch_2 | latch_2 | 12 | NULL | 3 | 100.00 | Using where; Using filesort | | 1 | PRIMARY | taxonomy | eq_ref | PRIMARY | PRIMARY | 4 | test.taxonomy_graph.linkid | 1 | 100.00 | Using where | | 2 | DEPENDENT SUBQUERY | taxonomy | eq_ref | PRIMARY | PRIMARY | 4 | func | 1 | 100.00 | Using where; Using index | | 2 | DEPENDENT SUBQUERY | taxonomy_graph | ALL | NULL | NULL | NULL | NULL | 15 | 100.00 | Using where | +----+--------------------+----------------+--------+---------------+---------+---------+----------------------------+------+----------+-----------------------------+ 4 rows in set, 1 warning (0.00 sec) MariaDB [test]> SELECT VERSION(); +-------------------+ | VERSION() | +-------------------+ | 5.2.9-MariaDB-log | +-------------------+ 1 row in set (0.00 sec)