0

MySQL クエリに問題があります。

私は5つのテーブルを持っています(括弧内のキー):

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

私の状況では、2 つの瞬間を含む 1 つの旅行があり、すべての瞬間に 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;
4

2 に答える 2

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
于 2012-11-08T23:29:41.910 に答える
0

@かいい

このグループ化を 2 つの列で使用しましたが、結果は期待どおりではありません。

結果として、フィールド「moments」に次の値を持つ 2 つのレコードを取得します。

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

2番目の記録)

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

もちろん、可能であれば、私の質問のように1つの結果を得たいと思っています。

于 2012-11-08T23:34:03.827 に答える