将相关图片排序给艺术家 - PHP/MySQL
Posted
技术标签:
【中文标题】将相关图片排序给艺术家 - PHP/MySQL【英文标题】:Sorting related pictures to artists - PHP/MySQL 【发布时间】:2011-01-10 20:28:21 【问题描述】:我需要任何人的帮助,我会很感激的。
我已经做了 2 个 JOiN-s。事实上,我有 3 张桌子
-
艺术家姓名表 (m)
带有产品信息的表格,在本例中为图片地址 (p)
具有艺术家 ID 和产品 ID 的表。 (pmx)
这是 SELECT 语句:
SELECT
m.manufacturer_id ,
m.mf_name ,
p.product_id ,
p.product_full_image
FROM
jos_vm_product_mf_xref AS pmx
JOIN
jos_vm_manufacturer AS m ON m.manufacturer_id = pmx.manufacturer_id
JOIN
jos_vm_product AS p ON p.product_id = pmx.product_id
WHERE
m.mf_chars = 'm'
我想要达到的效果类似于 [http://www.ugallery.com/ArtistList.aspx?RC=1][1]
事实上我得到的只是:
-
名称1 - 产品1
名称1 - 产品2
名称2 - 产品1
名称1 - 产品3
我想要它,在 foreach (smth) smth 之后得到:
-
名称1 - prod1 prod2, prod3
名称2 - prod1 prod2
名称3....等
<ul>
<?php foreach ($this->artistlist as $item)
?>
<li><a href="index.php?option=com_virtuemart&page=shop.browse&manufacturer_id=<?php echo $item->manufacturer_id; ?>"><?php echo $item->mf_name; ?></a>
<a href="index.php?page=shop.product_details&flypage=flypage.tpl&product_id=<?php echo $item->product_id; ?>&option=com_virtuemart">
<img src="components/com_virtuemart/shop_image/product/<?php echo $item->product_full_image; ?>" >
</a>
</li>
<?php ?>
</ul>
这是我现在正在使用的 PHP 代码...
所以请,请,请...。谁能帮助我?
这是一段代码
foreach ($this->artistlist as $picture)
if(!isset($artists[$picture['manufacturer_id']])) <---this is line 22
$artists[$picture['manufacturer_id']] = array(
'name'=>$picture['mf_name']
);
所以...错误:警告:在第 35 行的 D:\Server\xampp\htdocs\ta\components\com_artists\views\artists\tmpl\default.php 中为 foreach() 提供的参数无效
foreach($artist['pictures'] as $pictureId=>$pictureFullImage)
还有另一个问题: 输出的 html 是这样的:
<ul>
<li>
<a href="/ta/index.php?option=com_virtuemart&page=shop.browse&manufacturer_id=3">Giorgi Mihkeil</a>
**</li><li>** <--- and, can we get rid of this pieces? *<a href="/ta/index.php?option=com_virtuemart&page=shop.browse&manufacturer_id=$picture->artist_id"></a>* <-- what is this link? where does it come from?
<a href="/ta/index.php?page=shop.product_details&flypage=flypage.tpl&product_id=1&option=com_virtuemart">
<img src="/ta/components/com_virtuemart/shop_image/product/Lonely_Boat_4cfa773e83874.jpg" >
</a> <a href="/ta/index.php?page=shop.product_details&flypage=flypage.tpl&product_id=2&option=com_virtuemart">
<img src="/ta/components/com_virtuemart/shop_image/product/Naked_Couple_4cfbd12805f5b.jpg" >
</a> <a href="/ta/index.php?page=shop.product_details&flypage=flypage.tpl&product_id=4&option=com_virtuemart">
<img src="/ta/components/com_virtuemart/shop_image/product/Lonely_Boat_4d246dbef30e1.jpg" >
</a></li></ul>
现在这个 html 就像:<ul><li>NAME </li><li> <img1><img2><img3> </li></ul>
我们可以像这样:<ul><li>NAME <img1><img2><img3> </li></ul>
吗?
【问题讨论】:
【参考方案1】:通常,您会为此使用 GROUP_CONCAT。
SELECT
m.mf_name ,
GROUP_CONCAT(p.product_id),
p.product_full_image
FROM
jos_vm_product_mf_xref AS pmx
JOIN
jos_vm_manufacturer AS m ON m.manufacturer_id = pmx.manufacturer_id
JOIN
jos_vm_product AS p ON p.product_id = pmx.product_id
WHERE
m.mf_chars = 'm'
GROUP BY m.mf_name
但是如果你选择图片,你不能使用它,你必须在你的应用程序语言中使用哈希。
【讨论】:
我的第一反应也是 GROUP_CONCAT... 可能仍然有效,如果您可以在 PHP 处理中解析 GROUP_CONCAT 结果以填充 IMG 标签。 是的,我已经尝试过了,但实际上当在 mysql 的 Query 选项卡中进行此查询时,我只得到了该艺术家的 1 张图片【参考方案2】:假设您已经将图片放入数组中:
$artists = array();
foreach($pictures as $picture)
if(!isset($artists[$picture['manufacturer_id']]))
$artists[$picture['manufacturer_id']] = array(
'name'=>$picture['mf_name']
);
$artists[$picture['artist_id']]['pictures'][$picture['product_id']] = $picture['product_full_image'];
foreach($artists as $artistId=>$artist)
echo $artist['name'].': ';
foreach($artist['pictures'] as $pictureId=>$pictureFullImage)
echo "<img src='$pictureFullImage' />";
这比 dqhendricks 提出的解决方案要复杂一些,因为它不仅存储艺术家的 ID,还存储他/她的姓名。这意味着涉及到一个额外的数组层。
根据您在下面的评论:http://pastebin.com/2Cuyvp3U - 我认为应该这样做吗?虽然不知道你突然引入的 mf_prior 字段是什么...
【讨论】:
哇...感谢您这么快的回复!!!我使用了这段代码......它给了我第一行的错误 - foreach - 说为 foreach() 提供的参数无效。所以..我现在可能会玩小傻瓜......但是有些事情我无法通过这段代码弄清楚......我在foreach中有这个数组 - foreach ($this->artistlist as $item) .. .. artistlist as $item) ?> mf_name; ?> product_full_image; ?>" >mf_prior; ?> 这是我的代码.... 可能想将其添加到您的问题中 - cmets 中的代码往往会严重格式化报价;) 任何想法如何使我的网站根据您的代码工作?它真的让我死了......我已经考虑了两天了,我在这个网站上找到了和你一样的代码,但无法根据我的情况调整它...... 根据您刚刚添加到问题中的内容,使用指向 pastebin 的链接更新了我的答案 :)【参考方案3】:在您的查询中添加订单依据
ORDER BY m.manufacturer_id ,p.product_id
在您的 foreach 循环上解析有序查询会容易得多。
【讨论】:
【参考方案4】:您可能想要处理这个 PHP 端。在伪代码中。
$record_list = array();
while ($row_result)
if (!array_key_exists($row_result['name'], $record_list))
$record_list[$row_result['name']] = array();
$record_list[$row_result['name']][] = $row_result['value'];
var_dump($record_list);
这将以您正在寻找的格式创建一个多维数组。
【讨论】:
以上是关于将相关图片排序给艺术家 - PHP/MySQL的主要内容,如果未能解决你的问题,请参考以下文章
PHP / MYSQL:如何在while循环中循环来自查询的匹配结果