【问题标题】:mysql join two rows with shared column entrymysql用共享列条目连接两行
【发布时间】:2012-05-04 18:15:05
【问题描述】:

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

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

假设一个文件有两行:

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

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

cyclist.jpg 04-05-2012 是的

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

【问题讨论】:

    标签: php mysql join inner-join


    【解决方案1】:

    如果您想自动连接两行,这意味着您可能只需创建一行而不拆分它:

    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
    

    【讨论】:

    • 谢谢 biesior。目前我在代码中执行此操作,但想将它们全部选择为一个 mysql 结果行。如何使用文件创建一个结果 |日期 |你第一次写的脸?
    • @Sam:我向您展示了它应该存储在数据库中,连接来自同一个表的记录不是一个好主意,因为您几乎无法控制值如何来自冲突的列将被合并,无论如何我很快就会给你写一个示例查询。
    • 由于数据的半结构化格式,数据库是结构化的。有的文件有日期信息,有的有人脸信息,还有大约 20 个其他可选字段,因为大多数文件只有一种或两种标签类型,所以在每行中作为列是低效的。
    • 感谢 Biesior 的所有努力。这正是我想要的。知道它一定是可能的,只是不知道 RDB 术语来搜索它。
    猜你喜欢
    • 2017-12-13
    • 1970-01-01
    • 2012-05-07
    • 2019-06-05
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2011-05-02
    相关资源
    最近更新 更多