【问题标题】:How do i GROUP BY or DISTINCT inside array?我如何在数组中进行 GROUP BY 或 DISTINCT?
【发布时间】:2010-12-16 00:30:00
【问题描述】:

我搜索了高低,找不到与我所拥有的类似的问题。

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

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

  • 查询photos表以获取基于类别id的id,并且由于分页而开始,限制。
  • 根据我刚刚从第一个查询中获得的照片 ID 查询 照片标记表

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

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

我现在明白了:(所以我很接近不是吗?)

--------- 卡布奇诺 餐厅 酒吧 咖啡机 餐厅 咖啡 咖啡 餐厅 餐厅 餐厅 咖啡 咖啡 餐厅 餐厅 咖啡机 餐厅 咖啡

我想知道空格是不是什么东西?我是从复制和粘贴中得到的...

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

【问题讨论】:

  • 示例代码可能容易受到SQL injection的攻击,这是一个非常严重的security risk。要修复这个漏洞,请从过时的 mysql 驱动程序切换到PDO 并使用prepared statements。如果您需要 PDO 教程,请尝试 "Writing MySQL Scripts with PHP and PDO"。您保存的网站可能只是您自己的。
  • 确实,这段代码正在乞求被利用。但是 OP 可能不会很快用 PDO 交换这个代码(否则他已经在使用 PDO)。因此,一个更实用且易于采用的建议:将所有 $id 变量包装在 intval 中,例如cat_id='.intval($fileID).
  • 谢谢outis,我还没有做realescapes并清理一下。该代码也在受密码保护的管理员内运行。那些不知道mysql和myspace之间差异的人会使用它。但我会阅读 PDO - 虽然它看起来有点超出我的联盟。有一些关于如何进行安全连接、查询和结果的简单示例代码?
  • outis 的最后一个链接看起来不错。
  • 相信我:你不能相信用户。可能会出现谁知道这在做什么,或者其他人可能会闯入他们的帐户,或者某些用户的计算机可能会被worm 感染(利用SQL 注入的数量不小)。安全需要从设计过程开始就存在,而不是事后考虑或次要功能。我发现 PDO 比旧的 mysql 驱动程序更易于使用。 Query resultstraversable,仅此而已。

标签: php sql select distinct


【解决方案1】:

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

我相信这个查询会让数据库为你做所有的工作:

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 加入。它不仅会产生预期的结果,而且效率更高。当一个人可以进行多次查询时,没有充分的理由。
  • 谢谢乔恩,我还没试过你的,但我会把它放在小猫里。约翰五世为我工作,我先试了一下。感谢您的宝贵时间
  • 我说得太早了,我正在尝试你的问题,乔恩
【解决方案2】:

如果您一次只获取一条记录,distinct 不起作用,因此将数据放入 PHP 数组中,然后使用 array_unique,这是 PHP 进行 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> 
     }
      ?> 

【讨论】:

  • 嗨,约翰,这非常简单!哇!谢啦!我可以给你买杯咖啡吗?这一切都很好,我想我也明白了,所以这很重要:-)。
  • 哦,是的,我按回车键太快了。它所做的一件事是在 contains not 标签的底部添加一个 li?
  • 嘿约翰,空的 li 是因为一张照片根本没有标签。我如何告诉它忽略未标记的照片。无论如何,我会在此期间进行头脑风暴。我也很想给你买杯咖啡(在网站上有按钮吗?)
  • 实际上,当我仔细检查与每张照片关联的标签时,我注意到它没有向我显示所有标签。例如照片 id=293 有咖啡、卡布奇诺、微笑 但我只是从那张照片中喝咖啡?
【解决方案3】:

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

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

【讨论】:

  • 谢谢 Ghostpsalm,它奏效了!圣诞快乐,新年快乐 :-)
【解决方案4】:

SELECT DISTINCT tag_name FROM photoTagged WHERE file_id=".$rowFile['id']?

【讨论】:

  • 嗨,Diogo,我希望这能奏效。我应该说我也试过了。在我看来,我正在尝试对标签名称进行分组,但无论如何查询只产生一个(我的意思是每个照片 ID)。
  • 顺便说一句,你还有一段时间。您可能会从不止一张照片或其他东西中获得结果。此外,对结果进行分组(等于按顺序排列)。你应该使用不同的
  • 好的,谢谢 Diogo,在你的帮助下,我想我差不多了。
  • 嘿 Diogo 我已经用你说的代码更改编辑了我的帖子,它产生的标签更少,但结果仍然有点奇怪。
  • 好吧,我需要查看更多代码和数据库中的一些日期(来自两个表)...尝试直接在数据库上运行这些查询并遵循算法的逻辑,它是否显示正确输出?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
相关资源
最近更新 更多