我有四个链接的表。
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();
);
答案 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'];
}
}
}
如果我正确地读你,那么这应该输出你正在寻找的东西。