我如何在数组内部GROUP BY或DISTINCT?

时间:2010-12-16 00:30:00

标签: php sql select distinct

我搜索过高低,无法找到类似的问题。

我是初学者,请原谅我笨重的查询结构。

我正在尝试(在输出下方附加屏幕抓取):

  • 查询照片表以根据类别ID获取ID,并且因为分页而启动,限制。
  • 根据我从第一个查询中获得的照片ID,查询照片标记表

但我的问题是我无法对标签进行分组,有些照片的标签名称相同。输出只显示每张照片的所有标签。我希望餐厅只展示一次......

<?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

我想知道这些空间是什么吗?我从复制粘贴中得到了...

任何进一步的帮助将不胜感激: - )

4 个答案:

答案 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必须将查询加载到临时表中,但它应该可以正常工作。