我在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;
购买你有多个图像的每个时刻?你无法获得预期的输出。这三个文件名都不是附在166:F50MTTZK,VPGPFMMS,8J1OT7IT上。 –
结果是正确的,每个时刻有5个图像。如果你只想选择一张图片,mysql应该在哪些条件下选择一张图片?最新的?最老的?随机? – Kaii
@Kaii,我想从rowset中得到第一张图片,如果有可能按名称或日期排列,那么这将是完美的 – sanneo