我搜索过高低,无法找到类似的问题。
我是初学者,请原谅我笨重的查询结构。
我正在尝试(在输出下方附加屏幕抓取):
但我的问题是我无法对标签进行分组,有些照片的标签名称相同。输出只显示每张照片的所有标签。我希望餐厅只展示一次......
<?php
// Get the file ideez and dont go beyond pagination start,limit eg:30,10
$queryFile = "SELECT id FROM $tableName WHERE cat_id=".$fileID." LIMIT $start, $limit";
$resultFile = mysql_query($queryFile);
while ($rowFile = mysql_fetch_array($resultFile)) {
// Get the tag names based on the file ideez retrived from the above query
$queryTagged = "SELECT tag_name FROM photoTagged WHERE file_id=".$rowFile['id']." GROUP BY tag_name";
$resultTagged = mysql_query($queryTagged) or die(mysql_error());
while ($rowTagged = mysql_fetch_array($resultTagged)) {
$tagged = $rowTagged['tag_name'];
?>
<li><a href="#"><?php echo $tagged; ?></li>
<?php }} ?>
以上查询正在生成:
酒吧,cappucino,咖啡,咖啡机,餐厅,酒吧,cappucino,咖啡,咖啡机,餐厅,酒吧,咖啡,餐厅,酒吧,咖啡,咖啡机 餐厅,酒吧,卡布奇诺咖啡,咖啡,餐厅
我需要展示的是:
酒吧,cappucino,咖啡,咖啡机,餐厅
如果有人能提供帮助我会非常感激。
提前谢谢。
约翰
我的新代码是
<?php
// Get the file ideez and dont go beyond pagination start,limit eg:30,10
$queryFile = "SELECT id FROM $tableName WHERE cat_id=".$fileID." LIMIT $start, $limit";
$resultFile = mysql_query($queryFile);
while ($rowFile = mysql_fetch_array($resultFile)) {
// Get the tag names based on the file ideez retrived from the above query
$queryTagged = "SELECT DISTINCT tag_name FROM photoTagged WHERE file_id=".$rowFile['id'];
$resultTagged = mysql_query($queryTagged) or die(mysql_error());
$rowTagged = mysql_fetch_array($resultTagged);
$tagged = $rowTagged['tag_name'];
?>
<li><a href="#"><?php echo $tagged; ?></li>
<?php } ?>
我现在得到这个:(所以我很亲近吗?)
---------- cappucino restaurant bar coffee machine restaurant coffee coffee restaurant restaurant restaurant coffee coffee restaurant restaurant coffee machine restaurant coffee
我想知道这些空间是什么吗?我从复制粘贴中得到了...
任何进一步的帮助将不胜感激: - )
答案 0 :(得分:2)
您应首先在照片和标签表之间执行连接,然后选择不同的标签。
我相信这个查询会让数据库为你完成所有工作:
SELECT DISTINCT tag_name
FROM (SELECT file_id FROM $tableName WHERE cat_id=$fileID LIMIT $start, $limit) t1
LEFT JOIN photoTagged ON t1.id = photoTagged.file_id
您还可以对数据库中的标记进行排序(ORDER BY tag_name
)。
我自己没试过,所以也许语法有点偏。但这个想法应该有效。
答案 1 :(得分:1)
distinct不起作用,所以把数据放在PHP数组中然后使用array_unique,这是PHP的方式做不同的
<?php
// Get the file ideez and dont go beyond pagination start,limit eg:30,10
$queryFile = "SELECT id FROM $tableName WHERE cat_id=".$fileID." LIMIT $start, $limit";
$resultFile = mysql_query($queryFile);
while ($rowFile = mysql_fetch_array($resultFile)) {
// Get the tag names based on the file ideez retrived from the above query
$queryTagged = "SELECT tag_name FROM photoTagged WHERE file_id=".$rowFile['id'];
$resultTagged = mysql_query($queryTagged) or die(mysql_error());
$rowTagged = mysql_fetch_array($resultTagged)
$tagged[] = $rowTagged['tag_name'];
}
// Let PHP do the work.
$tagged=array_unique($tagged);
while (list(,$val) = each($tagged)) {
echo "<li><a href="#">$val</li>
}
?>
答案 2 :(得分:0)
SELECT DISTINCT tag_name FROM photoTagged WHERE file_id=".$rowFile['id']
?
答案 3 :(得分:0)
你需要做一个子查询来避免照片的分页问题。如果您希望所选标签是第一个查询中找到的照片的子集,则需要执行以下操作。
<?php
$queryTagged = "SELECT TAG.tag_name, count(TAG.tag_name) AS num FROM photoTagged as TAG JOIN (SELECT id FROM $tableName WHERE cat_id=$fileID LIMIT $start, $limit) as PHOTO ON (PHOTO.id = TAG.file_id) GROUP BY TAG.tag_name";
$resultTagged = mysql_query($queryTagged) or die(mysql_error());
while ($tagged = mysql_fetch_assoc($resultTagged)) {
echo "<li id="'.$tagged['TAG.tag_name'].'"><a href="#">".$tagged['TAG.tag_name']." (".$tagged['TAG.num'].")</li>";
}
?>
通过这种方式,您将有两个查询,用于查找照片,另一个用于查找该页面上照片的标签。这在技术上需要更长的时间,因为MySQL必须将查询加载到临时表中,但它应该可以正常工作。