Php 如何在数组中按或区分分组?

Php 如何在数组中按或区分分组?,php,sql,select,distinct,Php,Sql,Select,Distinct,我到处找,找不到与我所拥有的类似的问题 我是初学者,请原谅我笨拙的查询结构 我正在尝试在输出的下面附加屏幕抓取: 查询photos表以根据类别id获取id,并开始,因为分页而限制。 根据我刚从第一次查询中获得的照片id查询照片标记表。 但我的问题是,我不能分组的标签,有些照片有相同的标签名称。并且输出只显示每张照片的所有标签。我希望餐厅只展示一次等等 <?php // Get the file ideez and dont go beyond pagination start,limi

我到处找,找不到与我所拥有的类似的问题

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

我正在尝试在输出的下面附加屏幕抓取:

查询photos表以根据类别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 }} ?>
上述查询正在生成:

酒吧,卡普西诺,咖啡,咖啡机,餐厅,酒吧,卡普西诺,咖啡,咖啡机,餐厅,酒吧,咖啡,餐厅,酒吧,咖啡,咖啡机 餐厅,酒吧,卡布西诺,咖啡,餐厅

我需要展示的是:

酒吧,卡普西诺,咖啡,咖啡机,餐厅

如果有人能帮忙,我将不胜感激

先谢谢你

约翰

我的新代码是

<?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 我想知道这些空间是不是什么东西?我是从复制粘贴中得到的


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

从photoTagged中选择DISTINCT tag\u name,其中file\u id=.$rowFile['id']?

如果您一次只获得一条记录,DISTINCT不起作用,因此将数据放在PHP数组中,然后使用array\u unique,这是PHPs执行DISTINCT的方式

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

您应该首先在照片和标签表之间执行联接,然后选择不同的标签

我相信此查询将让数据库为您完成所有工作:

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
您还可以按标记名称按数据库顺序对标记进行排序


我自己还没试过,所以可能语法有点不对劲。但是这个想法应该行得通。

您需要执行子查询,以避免照片的分页问题。如果您希望所选标签是第一次查询中找到的照片的子集,则需要执行以下操作

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

Hi Diogo,我希望它能工作。我应该说我也试过了。在我看来,似乎我正在尝试对标记名进行分组,但查询对每个照片id只生成一个标记名。顺便说一句,你有一段时间在另一段时间内。您可能会从多张照片或其他内容中获得结果。此外,结果相等的分组按顺序排列。你应该使用distinctOk cool,谢谢Diogo,我想在你的帮助下我几乎成功了。嘿,Diogo,我已经用你说的代码更改编辑了我的帖子,它生成的标签更少,但结果仍然有点奇怪。嗯,我需要从两个表中查看更多的代码和数据库中的一些日期。。。尝试直接在数据库上运行这些查询,并遵循算法的逻辑,它是否显示正确的输出?示例代码可能容易受到攻击,这是一个非常严重的问题。要修复此漏洞,请将过时的mysql驱动程序切换到并使用。如果您需要PDO教程,请尝试。你保存的网站可能只是你自己的。事实上,这段代码正在乞求被利用。但是OP可能不会很快用PDO交换这段代码,否则他已经在使用PDO了。因此,一个更实用、更易于采纳的建议是:请将所有$id变量包装在intval中,例如cat_id='.intval$fileID.Thank you outis,我还没有完成realsecases并稍微清理一下。代码也在受密码保护的管理员中运行。那些不知道mysql和myspace之间的区别的人都会使用这种方法。但我会仔细阅读PDO的内容——尽管它看起来有点不适合我。有一些关于如何建立安全连接、查询和结果的简单示例代码吗?outis的最后一个链接看起来不错。相信我:你不能信任用户。可能会有人知道哲在做什么,或者其他人可能会闯入他们的帐户,或者某些用户的计算机可能会被病毒感染,而利用SQL注入的人也不少。安全性需要从设计过程一开始就存在,而不是事后考虑或次要功能。我发现PDO比旧的mysql驱动程序更易于使用。你就是其中之一。嗨,约翰,那太容易了!哇!谢谢你,伙计!我能给你买杯咖啡吗?这一切都很好,我想我也明白了,所以这很重要:-。哦,是的,我按下回车键太快了。它所做的一件事是在底部添加一个li,该li不包含标签?嘿,John,空的li是因为一张照片根本没有标签。我如何告诉它忽略未标记的照片。无论如何,我会在同一时间进行头脑风暴。我真的想给你买杯咖啡网站上有按钮吗?事实上,当我仔细检查与每张照片相关的标签时,我注意到它并没有全部显示出来
标签。例如,照片id=293有咖啡、卡布奇诺、微笑,但我只从照片中得到咖啡?+1用于加入。它不仅能达到预期的效果,而且效率更高。当一个问题可以解决时,没有充分的理由进行多次查询。谢谢Jon,我还没有试过你的问题,但我会把它保存在kitty中。约翰五世为我工作,我先试过。谢谢你的时间,我说得太快了,我在试你的问题,谢谢你的鬼诗篇,真是太棒了!圣诞快乐,新年快乐:-