Look at code below.Yellow highlighted lines are queries that you want to join and green highlighted
lines are inner join conditions.
Lets start with database:
CREATE TABLE IF NOT EXISTS `cconn` ( `connID` int(11) NOT NULL AUTO_INCREMENT, `lineAID` int(11) NOT NULL, `lineBID` int(11) NOT NULL, `name` varchar(50) NOT NULL, PRIMARY KEY (`connID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; INSERT INTO `cconn` (`connID`, `lineAID`, `lineBID`, `name`) VALUES (1, 1, 2, 'Munich, Germany'), (2, 3, 4, 'Dortmund, Germany'); CREATE TABLE IF NOT EXISTS `cline` ( `lineID` int(11) NOT NULL AUTO_INCREMENT, `typeID` int(11) NOT NULL, `name` varchar(23) NOT NULL, PRIMARY KEY (`lineID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; INSERT INTO `cline` (`lineID`, `typeID`, `name`) VALUES (1, 1, 'E 53'), (2, 2, 'E 52'), (3, 3, 'E 15'), (4, 4, 'E 28'); CREATE TABLE IF NOT EXISTS `ctype` ( `typeID` int(11) DEFAULT NULL, `name` varchar(11) NOT NULL, KEY `typeID` (`typeID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO `ctype` (`typeID`, `name`) VALUES (1, 'Highway'), (2, 'Expressway'), (3, 'Motorway'), (4, 'Transit');and here's the complex query
SELECT first.connID, first.lineID, first.roadName as 'Road name', first.n2 as 'Road Type', second.lineID, second.roadName as 'Road name', second.n2 as 'Road Type', second.cityName as 'City Name' FROM (SELECT connID, lineID, c2.name AS roadName, c3.name AS n2 FROM cconn c1 INNER JOIN cline c2 INNER JOIN ctype c3 WHERE (c1.lineAID = c2.lineID OR c1.lineBID = c2.lineID) AND c3.typeID = c2.typeID) AS first INNER JOIN (SELECT connID, lineID, c2.name AS roadName, c3.name AS n2, c1.name AS cityName FROM cconn c1 INNER JOIN cline c2 INNER JOIN ctype c3 WHERE (c1.lineAID = c2.lineID OR c1.lineBID = c2.lineID) AND c3.typeID = c2.typeID) AS second WHERE first.connID = second.connID AND first.lineID != second.lineID GROUP BY first.connID
and here's the result
connID | lineID | Road name | Road Type | lineID | Road name | Road Type | City Name |
---|---|---|---|---|---|---|---|
1 | 2 | E 52 | Expressway | 1 | E 53 | Highway | Munich, Germany |
2 | 4 | E 28 | Transit | 3 | E 15 | Motorway | Dortmund, Germany |
or you can use alternative solution with multiple aliases for a table:
SELECT connID, c1.name AS 'Road name', t1.name AS 'Road Type', c2.name AS 'Road Name', t2.name AS 'Road Type', c.name AS 'City Name' FROM `cconn` c INNER JOIN cline c1 ON c.lineAID = c1.lineID INNER JOIN cline c2 ON c.lineBID = c2.lineID INNER JOIN ctype t1 ON c1.typeID = t1.typeID INNER JOIN ctype t2 ON c2.typeID = t2.typeID
with resultset like this
connID | Road name | Road Type | Road Name | Road Type | City Name |
---|---|---|---|---|---|
1 | E 53 | Highway | E 52 | Expressway | Munich, Germany |
2 | E 15 | Motorway | E 28 | Transit | Dortmund, Germany |
No comments:
Post a Comment