0

ファイルのタグを格納するテーブルが1つあります。タグはさまざまなタイプにすることができます。多くのファイルがあり、それぞれに異なるタイプのタグが保存されています。

列:ファイル、タグタイプ、タグ

したがって、1つのファイルに2つの行があるとしましょう。

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

mysqlの結果が得られるように、ファイルのすべてのタグを1つの行に選択したいと思います。

cyclist.jpg2012年4月5日true

現在、タグタイプごとに1つずつ、上記の2つのクエリを実行しています。1つの共有列(ファイル)だけに基づいて、同じ列(タグ)で同じテーブルを使用して、ある種の結合を実行できるかどうかを知りたいです。

4

1 に答える 1

1

2 つの行を自動的に結合したい場合は、おそらく分割せずに 1 つの行を作成するだけでよいことを意味します。

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

それ以外の場合は、別々の行を保持する必要がある場合は、1 つのクエリですべての行を選択するだけです。

$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;
        }
    }
}

編集:

ここで約束したように、2 つの行を 1 つのクエリで 1 つに結合するサンプルを示します$mergedRowが、PHP でそれらをマージする方法をお勧めします :)

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
于 2012-05-04T18:39:50.813 に答える