【问题标题】:MySQL Multiple Table JoinMySQL 多表连接
【发布时间】:2011-01-27 17:56:58
【问题描述】:

我有 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,因为我可能想要保留合法的重复项。有没有办法使用连接而不是像下面的语句那样使用内部选择来执行此查询?

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

另外,如果我将使用内部选择,连接是否会出现任何性能问题?

【问题讨论】:

    标签: mysql distinct join


    【解决方案1】:

    有没有什么方法可以使用联接而不是像下面的语句那样使用内部选择来执行此查询?

    有,但效率不高,可以省略一些预期的重复项:

    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;
    

    另外,如果我将使用内部选择,连接是否会出现任何性能问题?

    在您的情况下,是的:子选择会更快。

    MyISAM 表上,在某些情况下,子选择往往比GROUP BY 查询更快,因为MyISAM 中的GROUP BY 由于排序/实现开销而相当昂贵:

    【讨论】:

      【解决方案2】:

      也许你必须在第二个 ON 中指定你的意思是哪个 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 表上的子查询更快。

      【讨论】:

        猜你喜欢
        • 2021-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-04
        • 2015-01-14
        相关资源
        最近更新 更多