将相关图片排序给艺术家 - 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&amp;page=shop.browse&amp;manufacturer_id=3">Giorgi Mihkeil</a>

**</li><li>** <--- and, can we get rid of this pieces? *<a href="/ta/index.php?option=com_virtuemart&amp;page=shop.browse&amp;manufacturer_id=$picture->artist_id"></a>* <-- what is this link? where does it come from?    
    <a href="/ta/index.php?page=shop.product_details&amp;flypage=flypage.tpl&amp;product_id=1&amp;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&amp;flypage=flypage.tpl&amp;product_id=2&amp;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&amp;flypage=flypage.tpl&amp;product_id=4&amp;option=com_virtuemart">
       <img src="/ta/components/com_virtuemart/shop_image/product/Lonely_Boat_4d246dbef30e1.jpg" >
    </a></li></ul>

现在这个 html 就像:&lt;ul&gt;&lt;li&gt;NAME &lt;/li&gt;&lt;li&gt; &lt;img1&gt;&lt;img2&gt;&lt;img3&gt; &lt;/li&gt;&lt;/ul&gt; 我们可以像这样:&lt;ul&gt;&lt;li&gt;NAME &lt;img1&gt;&lt;img2&gt;&lt;img3&gt; &lt;/li&gt;&lt;/ul&gt; 吗?

【问题讨论】:

【参考方案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循环中循环来自查询的匹配结果

JavaScript DOM编程艺术 读书笔记 第4章 案例研究:Javascript图片库

javaScript DOM编程艺术

使用 MPMediaQuery 按艺术家对专辑进行排序

rails视图按各种类别排序模型

AI 音辨世界:艺术小白的我,靠这个AI模型,速识音乐流派选择音乐 ⛵