Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql左连接表2,其中来自表3的字段_Mysql - Fatal编程技术网

Mysql左连接表2,其中来自表3的字段

Mysql左连接表2,其中来自表3的字段,mysql,Mysql,表媒体 id, options 1 a 2 b 3 c 表格地图 id, title, type 1 f x 2 g x 3 h y 4 z x 4 w y 表媒体地图 maps_id media_id 1 2 2 3 我正在尝试从表介质中选择所有数据并连接表映射。每个媒体可以包含多个地图 SELECT media_t.id, media_t.options

表媒体

id, options
1   a
2   b
3   c
表格地图

id, title, type
1   f      x
2   g      x    
3   h      y    
4   z      x
4   w      y
表媒体地图

maps_id  media_id   
1        2
2        3
我正在尝试从表介质中选择所有数据并连接表映射。每个媒体可以包含多个地图

SELECT media_t.id, media_t.options,
    GROUP_CONCAT(CASE WHEN maps_t.type = 'x' THEN maps_t.title END ORDER BY maps_t.title SEPARATOR ', ') as x,
    GROUP_CONCAT(CASE WHEN maps_t.type = 'y' THEN maps_t.title END ORDER BY maps_t.title SEPARATOR ', ') as y
    FROM media_table as media_t
    LEFT JOIN maps_table as maps_t
    ON media_t.id = (
        SELECT maps_id FROM {table_media_maps} 
        WHERE media_id = maps_t.id
    )
    GROUP BY media_t.id

如果你需要加入3个tbals,你可以试试

SELECT me.id, me.options,
GROUP_CONCAT(CASE WHEN ma.type = 'x' THEN ma.title END ORDER BY ma.title SEPARATOR ', ') as x,
GROUP_CONCAT(CASE WHEN ma.type = 'y' THEN ma.title END ORDER BY ma.title SEPARATOR ', ') as y
FROM media as me
LEFT JOIN media_maps mm on me-id = mm.media_id 
LEFT JOIN maps  ma  ON mm.maps_id = ma.id
GROUP BY me.id

无论如何,您的数据都不是完整的。 我为maps表设置了一个右连接,这样您就可以看到它是有效的,很可能您希望还有一个左连接,但是您仍然需要连接所有三个表


DBFIDLE

您的解决方案和scaisEdge解决方案有什么区别?他的解决方案不会显示第一行,因为右连接获取所有数据并尝试将其与其余数据连接起来,elsw这与你所看到的解决方案相同,只是观察到右连接非常罕见,但我不介意,当我测试我的查询时,我发现数据不完整,并且根本没有显示组连接,所以我构建了它,只是为了看看,但我提到他可能想要左连接
CREATE TABLE media_table  (
  `id` INTEGER,
  `options` VARCHAR(1)
);

INSERT INTO media_table 
  (`id`, `options`)
VALUES
  ('1', 'a'),
  ('2', 'b'),
  ('3', 'c');
CREATE TABLE table_media_maps (
  `maps_id` INTEGER,
  `media_id` INTEGER
);

INSERT INTO table_media_maps
  (`maps_id`, `media_id`)
VALUES
  ('1', '2'),
  ('2', '3');
CREATE TABLE maps_table  (
  `id` INTEGER,
  `title` VARCHAR(1),
  `type` VARCHAR(1)
);

INSERT INTO maps_table 
  (`id`, `title`, `type`)
VALUES
  ('1', 'f', 'x'),
  ('2', 'g', 'x'),
  ('3', 'h', 'y'),
  ('4', 'z', 'x'),
  ('4', 'w', 'y');
SELECT media_t.id, media_t.options,
    GROUP_CONCAT(
    CASE WHEN maps_t.type = 'x' THEN maps_t.title END
    ORDER BY maps_t.title SEPARATOR ', ') 
    as x,
    GROUP_CONCAT(
    CASE WHEN maps_t.type = 'y' THEN maps_t.title END
    ORDER BY maps_t.title SEPARATOR ', ') 
    as y
    FROM media_table as media_t
    LEFT JOIN table_media_maps m_m_t ON media_t.id = m_m_t.media_id
    right JOIN maps_table as maps_t
    ON maps_t.id = m_m_t.maps_id
    GROUP BY media_t.id, media_t.options
id | options | x | y ---: | :------ | :- | :--- null | null | z | h, w 2 | b | f | null 3 | c | g | null