2012-11-08 49 views
0

我在MySQL查询中遇到了一些问题。使用组和多个表的MySQL查询的级联结果

我有5个表(括号键):

trips (tripId) 
trips_moments (tripId, momentId) 
moments (momentId) 
moments_images (momentIs, imageId) 
images (imageId) 

在我的情况我有1班,其中包含2个瞬间,每一刻都包含5张图片。

我想结果在现场得到“瞬间”:代替

166;Kościuszko mound in Cracow;2012-11-08 15:38:14;6;F50MTTZK;jpg;6R2XJB9X| 
167;Pope John Paul II (Jan Paweł 2) home town - Wadowice;2012-11-08 15:57:15;19;66B7VQ84;jpg;ILQYDQUC 

166;Kościuszko mound in Cracow;2012-11-08 15:38:14;6;F50MTTZK;jpg;6R2XJB9X| 
166;Kościuszko mound in Cracow;2012-11-08 15:38:14;7;9PY1BZD1;jpg;TP7U07ST| 
166;Kościuszko mound in Cracow;2012-11-08 15:38:14;8;VPGPFMMS;jpg;VF95BNNQ| 
166;Kościuszko mound in Cracow;2012-11-08 15:38:14;9;EC7NL3HC;jpg;PD1CEQE6| 
166;Kościuszko mound in Cracow;2012-11-08 15:38:14;10;8J1OT7IT;jpg;ZL8WAWCJ| 
167;Pope John Paul II (Jan Paweł 2) home town - Wadowice;2012-11-08 15:57:15;19;66B7VQ84;jpg;ILQYDQUC| 
167;Pope John Paul II (Jan Paweł 2) home town - Wadowice;2012-11-08 15:57:15;20;HZIPGJY7;jpg;FOOWJ8BV| 
167;Pope John Paul II (Jan Paweł 2) home town - Wadowice;2012-11-08 15:57:15;21;9JOXXPJQ;jpg;ZIVJ5V7K| 
167;Pope John Paul II (Jan Paweł 2) home town - Wadowice;2012-11-08 15:57:15;22;IS1JPW1N;jpg;31M4XVBM| 
167;Pope John Paul II (Jan Paweł 2) home town - Wadowice;2012-11-08 15:57:15;23;OTOWNDZA;jpg;C03UFMBK 

你可以在我的结果,与166和167记录重复看许多时候包含瞬间的图像。

我当前的查询:

SELECT 
`t`.`tripId`, 
`t`.`title`, 
`t`.`when`, 
GROUP_CONCAT(
    DISTINCT(
    CONCAT(
     m.momentId, ';', m.title, ';', m.created, ';', i.imageId, ';', i.fileNameBase, ';', i.fileNameExtension, ';', i.directory) 
    ) 
    SEPARATOR '|' 
) AS `moments` 
FROM `trips` AS `t` 
LEFT JOIN `trips_moments` AS `tm` ON t.tripId = tm.tripId 
LEFT JOIN `moments` AS `m` ON tm.momentId = m.momentId 
LEFT JOIN `moments_images` AS `mi` ON m.momentId = mi.momentId 
LEFT JOIN `images` AS `i` ON mi.imageId = i.imageId 
WHERE (t.userId = '1') 
GROUP BY `t`.`tripId` 
ORDER BY `t`.`tripId` ASC 

当前表结构:

CREATE TABLE IF NOT EXISTS `images` (
    `imageId` int(11) NOT NULL AUTO_INCREMENT, 
    `userId` int(11) NOT NULL, 
    `title` varchar(128) NOT NULL, 
    `description` text NOT NULL, 
    `fileNameBase` varchar(64) NOT NULL, 
    `fileNameExtension` varchar(4) NOT NULL, 
    `directory` varchar(64) NOT NULL, 
    `source` varchar(32) NOT NULL, 
    `created` datetime NOT NULL, 
    PRIMARY KEY (`imageId`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

CREATE TABLE IF NOT EXISTS `moments` (
    `momentId` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(128) NOT NULL, 
    `userId` int(11) NOT NULL, 
    `created` datetime NOT NULL, 
    PRIMARY KEY (`momentId`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

CREATE TABLE IF NOT EXISTS `moments_images` (
    `momentId` int(11) NOT NULL, 
    `imageId` int(11) NOT NULL, 
    PRIMARY KEY (`momentId`,`imageId`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `trips` (
    `tripId` int(11) NOT NULL AUTO_INCREMENT, 
    `userId` int(11) NOT NULL, 
    `title` varchar(128) NOT NULL, 
    `when` date NOT NULL, 
    `created` datetime NOT NULL, 
    PRIMARY KEY (`tripId`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

CREATE TABLE IF NOT EXISTS `trips_moments` (
    `tripId` int(11) NOT NULL, 
    `momentId` int(11) NOT NULL, 
    PRIMARY KEY (`tripId`,`momentId`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
+0

购买你有多个图像的每个时刻?你无法获得预期的输出。这三个文件名都不是附在166:F50MTTZK,VPGPFMMS,8J1OT7IT上。 –

+0

结果是正确的,每个时刻有5个图像。如果你只想选择一张图片,mysql应该在哪些条件下选择一张图片?最新的?最老的?随机? – Kaii

+0

@Kaii,我想从rowset中得到第一张图片,如果有可能按名称或日期排列,那么这将是完美的 – sanneo

回答

0

我现在不能测试,但是这可以给你一个想法,我改变moemnt_images参加这样的:

LEFT JOIN `moments_images` AS `mi` ON m.momentId = mi.momentId 
AND imageId = (select min(imageId) from moments_images where momentId=m.momentId) 

完整查询:

SELECT 
`t`.`tripId`, 
`t`.`title`, 
`t`.`when`, 
GROUP_CONCAT(
    DISTINCT(
    CONCAT(
     m.momentId, ';', m.title, ';', m.created, ';', i.imageId, ';', i.fileNameBase, ';', i.fileNameExtension, ';', i.directory) 
    ) 
    SEPARATOR '|' 
) AS `moments` 
FROM `trips` AS `t` 
LEFT JOIN `trips_moments` AS `tm` ON t.tripId = tm.tripId 
LEFT JOIN `moments` AS `m` ON tm.momentId = m.momentId 
LEFT JOIN `moments_images` AS `mi` ON m.momentId = mi.momentId and imageId = (select min(imageId) from moments_images where momentId=m.momentId) 
LEFT JOIN `images` AS `i` ON mi.imageId = i.imageId 
WHERE (t.userId = '1') 
GROUP BY `t`.`tripId` 
ORDER BY `t`.`tripId` ASC 
+0

它正在工作,谢谢。我认为需要做子查询,但希望有没有子查询的另一种解决方案。谢谢你们的快速解答。 – sanneo

0

@Kaii

我两列用这个分组,但由于预期的结果并不:

在结果我得到两个记录在这些领域的价值“瞬间”:

月1日的记录)

166;Kościuszko mound in Cracow;2012-11-08 15:38:14;9;EC7NL3HC;jpg;PD1CEQE6| 
166;Kościuszko mound in Cracow;2012-11-08 15:38:14;6;F50MTTZK;jpg;6R2XJB9X| 
166;Kościuszko mound in Cracow;2012-11-08 15:38:14;8;VPGPFMMS;jpg;VF95BNNQ| 
166;Kościuszko mound in Cracow;2012-11-08 15:38:14;10;8J1OT7IT;jpg;ZL8WAWCJ| 
166;Kościuszko mound in Cracow;2012-11-08 15:38:14;7;9PY1BZD1;jpg;TP7U07ST 

第二记录)

167;Pope John Paul II (Jan Paweł 2) home town - Wadowice;2012-11-08 15:57:15;20;HZIPGJY7;jpg;FOOWJ8BV| 
167;Pope John Paul II (Jan Paweł 2) home town - Wadowice;2012-11-08 15:57:15;22;IS1JPW1N;jpg;31M4XVBM| 
167;Pope John Paul II (Jan Paweł 2) home town - Wadowice;2012-11-08 15:57:15;19;66B7VQ84;jpg;ILQYDQUC| 
167;Pope John Paul II (Jan Paweł 2) home town - Wadowice;2012-11-08 15:57:15;21;9JOXXPJQ;jpg;ZIVJ5V7K| 
167;Pope John Paul II (Jan Paweł 2) home town - Wadowice;2012-11-08 15:57:15;23;OTOWNDZA;jpg;C03UFMBK 

我想在我的问题中得到一个结果,当然如果可能的话。