Php 如何在数组中按或区分分组?
我到处找,找不到与我所拥有的类似的问题 我是初学者,请原谅我笨拙的查询结构 我正在尝试在输出的下面附加屏幕抓取: 查询photos表以根据类别id获取id,并开始,因为分页而限制。 根据我刚从第一次查询中获得的照片id查询照片标记表。 但我的问题是,我不能分组的标签,有些照片有相同的标签名称。并且输出只显示每张照片的所有标签。我希望餐厅只展示一次等等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
<?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中。约翰五世为我工作,我先试过。谢谢你的时间,我说得太快了,我在试你的问题,谢谢你的鬼诗篇,真是太棒了!圣诞快乐,新年快乐:-