MySQL 使用共享列条目连接两行


mysql join two rows with shared column entry

我有一个存储文件标签的表。标记可以是不同的类型。有许多文件,每个文件都存储了不同类型的标签。

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

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

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

我想在一行中选择文件的所有标签,这样我就有一个 mysql 结果:

骑自行车的人.jpg 04-05-2012 真

目前,我对上述内容执行两个查询,每个标签类型一个查询。我想知道我是否可以基于一个共享列(文件)在相同的列(标签)上使用相同的表进行某种连接。

如果你想

自动连接两行,这意味着你可能只创建一行而不拆分它:

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; 

然后,您可以将亲子集与以下"配对":

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