我有一张桌子,上面放着文件标签。标签可以是不同的类型。有许多文件,每个文件都存储有不同类型的标签。

列:文件,标签类型,标签

因此,假设一个文件有两行:

cyclist.jpg | date | 04-05-2012
cyclist.jpg | face | true


我想将文件的所有标签选择为一行,这样我就得到了mysql结果:

cyclist.jpg 2012年4月5日真实

目前,我对上述两项进行了查询,每种标记类型均进行了一次查询。我想知道是否可以仅基于一个共享列(文件)对相同表,相同列(标签)进行某种连接。

最佳答案

如果要自动连接两行,则意味着您可以只创建一行而不拆分它:

file         | date       | face
cyclist.jpg  | 04-05-2012 | true


否则,如果需要保留单独的行,只需在一个查询中选择所有行:

$res = mysql_query("select * from tags where file='cyclist.jpg'");


然后迭代它们以完成“合并”记录:

$res = mysql_query("select * from tags_table where file='cyclist.jpg'");

$mergedRow = array();

while ($row = mysql_fetch_assoc($res)) {
    foreach ($row as $rowKey => $rowValue) {
        if (!array_key_exists($rowKey, $mergedRow)) {
            $mergedRow[$rowKey] = $rowValue;
        }
    }
}


编辑:

如所承诺的,这里是一个通过单个查询将两行合并为一个示例,但是我仍然建议在PHP中使用$mergedRow方法将它们合并:)

CREATE TABLE `files_table` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `tag_type` enum('PARENT','CHILD') NOT NULL DEFAULT 'PARENT',
  `date` date DEFAULT NULL,
  `file` varchar(255) NOT NULL DEFAULT '',
  `face` smallint(4) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


然后,您可以将PARENT-CHILDREN集与“配对”:

SELECT t1.file, t1.date, t2.face
    FROM files_table AS t1 JOIN files_table AS t2 ON (t1.file = t2.file)
    WHERE t1.tag_type = 'PARENT' AND t2.tag_type = 'CHILD'
    GROUP BY file

关于php - mysql通过共享列条目连接两行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10454044/

10-12 03:16