将mySQL表组合成一行?

时间:2010-12-27 18:38:10

标签: php mysql

我有四个链接的表。

images

cid     link
=======================
1       something.jpg
2       else.jpg

terms

cid     term         is_attr
================================
1      Location     0
2      Caption      1
3      Camera Lens  0

tags

cid      Name          term_id
==============================
1       somewhere      1
2       BFE            1
3       A word         2

linked_tags

cid    photo_id     tag_id
==========================
1      1            1
2      1            2
3      1            3

如果一个术语is_attr == 1,那么该图片的linked_tags表中只有一个条目。

如果我要查询图像表并同时获取标签,我该怎么做?

我想要(某些)返回:

_____________________________________________________________________________
cid      |link              |attributes        |tags                |
=========|==================|==================|====================|
1        |something.jpg     |__________________|____________________| 
         |                  ||term    |value  |||term    |value    ||
         |                  ||========|=======|||========|=========||
         |                  ||caption |A word |||Location|somewhere||
         |                  ||        |       |||Location|BFE      ||  

这就是我要找的(PHP方面):

//Row 1
array(
  'link' => "something.jpg",
  'attributes' => array('caption'=>"A word"),
  'tags' => array('Location'=>array('somewhere','BFE'))
);
//Notice 'caption' points to a string and 'location' points to an array
//Row 2
array(
  'link' => "else.jpg",
  'attributes' => array(),
  'tags' => array()
);
// OR
array(
  'link' => "else.jpg"
);
// OR
array(
  'link' => "else.jpg",
  'attributes' => array('caption'=>""),
  'tags' => array();
);

3 个答案:

答案 0 :(得分:0)

SELECT  i.*, GROUP_CONCAT(tag.name SEPARATOR ', ')
FROM    image i
JOIN    tag
ON      tag.image_id = i.id
GROUP BY
        i.id

<强>更新

表格格式假设每条记录中的列数相同,所有记录都具有相同的类型。

您的任务最好在三个查询中完成:

SELECT  cid, link
FROM    image
WHERE   cid = 1

(cid and link)

SELECT  t.name, tag.name
FROM    linked_tags lt
JOIN    tags
ON      tags.cid = lt.tag_id
JOIN    terms t
ON      t.cid = tags.term_id
WHERE   lt.photo_id = 1
        AND  t.is_attr = 1

(属性)

SELECT  t.name, tag.name
FROM    linked_tags lt
JOIN    tags
ON      tags.cid = lt.tag_id
JOIN    terms t
ON      t.cid = tags.term_id
WHERE   lt.photo_id = 1
        AND  t.is_attr = 0

(标签)

答案 1 :(得分:0)

您很可能想要GROUP_CONCAT功能。

编辑:

阿福。 Quassnoi打败了我。正如警告:GROUP_CONCAT的输出是长度限制的(默认情况下通常为1024字节),但您可以使用group_concat_max_length运行时设置覆盖它。

答案 2 :(得分:0)

我错过了什么,或者这只需要几个LEFT JOIN?

$query = 'SELECT images.cid, images.link, terms.term, tags.name, terms.is_attr FROM images LEFT JOIN linked_tags ON images.cid = linked_tags.photo_id LEFT JOIN tags ON linked_tags.tag_id = tags.cid LEFT JOIN terms ON tags.term_id = terms.cid WHERE 1 ORDER BY images.cid';
$result = mysql_query($query);

结果集将为每个图像提供多行,您可以使用PHP将数据解析为您需要的任何格式。

$image_list = array();
while ($line = mysql_fetch_assoc($result)) { // fetch mysql rows until there are no more
    if (!isset($image_list[$line['cid']]) { // checks to see if we have created this image array row yet
        // if not, create new image in image array using cid as the key
        $image_list[$line['cid']] = array('link' => $line['link'], 'attributes' => array(), 'tags' => array());
    }
    if ($line['term'] != null) { // if there are no linked attributes or tags, move on to the next image leaving both arrays empty, otherwise...
        if ($line['is_attr']) {
            // if attribute row, add attribute using term as key
            $image_list[$line['cid']]['attributes'][$line['term']] = $line['name'];
        } else {
            // if tag row, add tag using term as key
            $image_list[$line['cid']]['tags'][$line['term']] = $line['name']; 
        }
    }
}

如果我正确地读你,那么这应该输出你正在寻找的东西。