我有3个表,我正在尝试连接,并获得不同的结果。
CREATE TABLE `car` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB
mysql> select * from car;
+----+-------+
| id | name |
+----+-------+
| 1 | acura |
+----+-------+
CREATE TABLE `tires` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`tire_desc` varchar(255) DEFAULT NULL,
`car_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `new_fk_constraint` (`car_id`),
CONSTRAINT `new_fk_constraint` FOREIGN KEY (`car_id`) REFERENCES `car` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB
mysql> select * from tires;
+----+-------------+--------+
| id | tire_desc | car_id |
+----+-------------+--------+
| 1 | front_right | 1 |
| 2 | front_left | 1 |
+----+-------------+--------+
CREATE TABLE `lights` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`lights_desc` varchar(255) NOT NULL,
`car_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `new1_fk_constraint` (`car_id`),
CONSTRAINT `new1_fk_constraint` FOREIGN KEY (`car_id`) REFERENCES `car` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB
mysql> select * from lights;
+----+-------------+--------+
| id | lights_desc | car_id |
+----+-------------+--------+
| 1 | right_light | 1 |
| 2 | left_light | 1 |
+----+-------------+--------+这是我的问题。
mysql> SELECT name, group_concat(tire_desc), group_concat(lights_desc)
FROM car
left join tires on car.id = tires.car_id
left join lights on car.id = car_id
group by car.id;
+-------+-----------------------------------------------+-----------------------------------------------+
| name | group_concat(tire_desc) | group_concat(lights_desc) |
+-------+-----------------------------------------------+-----------------------------------------------+
| acura | front_right,front_right,front_left,front_left | right_light,left_light,right_light,left_light |
+-------+-----------------------------------------------+-----------------------------------------------+我得到了重复的条目,这就是我想要得到的。
+-------+-----------------------------------------------+--------------------------------+
| name | group_concat(tire_desc) | group_concat(lights_desc) |
+-------+-----------------------------------------------+--------------------------------+
| acura | front_right,front_left | right_light,left_light |
+-------+-----------------------------------------------+--------------------------------+我不能在group_concat中使用distinct,因为我可能有想要保留的合法副本。有没有办法使用连接而不是像下面的语句那样使用inner来执行此查询?
SELECT name,
(select group_concat(tire_desc) from tires where car.id = tires.car_id),
(select group_concat(lights_desc) from lights where car.id = lights.car_id)
FROM car另外,如果我使用内部selects,在连接的时候会有性能问题吗?
发布于 2010-03-15 23:47:57
有没有办法使用joins而不是像下面的语句那样使用inner来执行此查询?
有,但效率不高,可以省略一些预期的重复项:
SELECT name, group_concat(DISTINCT tire_desc), group_concat(DISTINCT lights_desc)
FROM car
left join tires on car.id = tires.car_id
left join lights on car.id = car_id
group by car.id;另外,如果我使用内部selects,在连接的时候会有任何性能问题吗?
在你的例子中,是的:子选择会更快。
在MyISAM表上,在某些情况下,子选择往往比GROUP BY查询更快,这是因为MyISAM中的GROUP BY由于排序/物化开销而相当昂贵:
发布于 2010-03-15 23:49:27
也许你必须在第二个中指定你指的是哪个car_id。
SELECT name, group_concat(tire_desc), group_concat(lights_desc)
FROM car
left join tires on car.id = tires.car_id
left join lights on car.id = **lights**.car_id
group by car.id;我相信在InnoDB表上连接比子查询更快。
https://stackoverflow.com/questions/2448355
复制相似问题