【问题标题】:PHP and outputting one-to-many resultsPHP并输出一对多结果
【发布时间】:2009-02-12 14:26:41
【问题描述】:

到目前为止,我只处理了 php 中的一对一关系,但我遇到了一个涉及一对多关系的问题。我已经坐了几天没有运气,所以我迫切希望有人介入并在我失去理智之前向我展示解决方案。

在我的数据库中有一系列 url,这些 url 由 SELECT 查询以及来自不同表的各种其他字段接收。每个 url 至少有一个与之关联的类别,但可以有多个类别。所以在我的结果中,我可能会看到一些看起来像这样的东西:

link_id = 3   url= 'http://www.somesite1.com'   category = 'uncategorised'
link_id = 4   url= 'http://www.somesite2.com'   category = 'travel'
link_id = 4   url= 'http://www.somesite2.com'   category = 'fun'
link_id = 4   url= 'http://www.somesite2.com'   category = 'misc'
link_id = 3   url= 'http://www.somesite3.com'   category = 'uncategorised'

我有这个工作,有点。当我使用while循环和mysql fetch数组循环并打印它们时,结果看起来与上面完全一样。太好了,除了我需要的是它读取类似的内容:

link_id = 4   url = 'http://www.somesite2.com'   category = 'travel fun misc'

因此,基本上每个 url 的所有类别都会以某种方式组合在一起,因为它们会被打印出来。我的第一次尝试让我尝试了一个嵌套的 while 循环,但它不起作用,我不确定这是否可行。除此之外,我想知道我是否可能需要一个多维数组(完全猜测,我以前从未使用过)。

我按照上面的链接 id 对这些结果进行排序,所以我知道当前循环迭代中的链接 id 是否与上一次迭代中的链接 id 相匹配 - 那么我有多个类别的东西。我认为我真的很接近,但我就是想不通。

有什么想法吗?

【问题讨论】:

    标签: php mysql database one-to-many


    【解决方案1】:

    mysql中还有“GROUP_CONCAT”函数。 这应该正是您想要实现的目标。

    类似:

    SELECT url, GROUP_CONCAT(category) AS categories FROM yourtable GROUP BY url 
    

    【讨论】:

    • 这在我运行查询时完美运行,当我将它插入我的 php 脚本时再次运行。我不知道这个功能,但这正是我所追求的。谢谢!
    【解决方案2】:

    您应该使用连接表。

    首先你有一个链接表

    id = 1 url = something
    id = 2 url = something else
    

    然后你有一个类别表

    id = 1 category = something
    id = 2 category = something else
    

    那么你就有了一个连接表

    url_id = 1 category_id = 1
    url_id = 1 category_id = 2
    url_id = 2 category_id = 1
    

    这至少应该让你开始。

    【讨论】:

    • 啊抱歉,我应该说得更清楚一点。如果我理解正确,我确实有这样的设置。一个名为 categories 的表,只是所有存在的类别的存储库,然后是一个仅包含 url 的表,然后是一个带有 url_id 和 cat_id 的表将它们连接在一起。
    • 没问题 :) 如果您愿意,我会保留答案,直到您更新问题为止。
    【解决方案3】:

    您需要使用控制中断算法。

    set last_link variable to null
    set combined_category to null
    exec query
    
    loop over result set {
        if last_link == null {
            last_link=fetch_link
        }
        if fetch_link==last_link {
            set combined_category+=ltrim(' '.fetch_category)
        } else {
            display html for last_link and combined_category
            set last_link=fetch_link
            set combined_category=fetch_category
        }
    }//loop
    
    display html for last_link and combined_category
    

    我使用“显示 html”作为通用“工作”事件,您可以将其推送到数组结构等中...

    【讨论】:

      【解决方案4】:

      使用以 id 和 url 为键的数组遍历值并添加如下:

      $link_categories[ $id ] .= $category." ";
      
      $result = mysql_query("SElECT * FROM LINKS");
      
      $link_categories = array();
      
      while ($row = mysql_fetch_array($result,MYSQL_ASSOC))
      {
          if (!isset($link_categories[$row['link']]))
              $link_categories[$row['link']] = " ";
          else
              $link_categories[$row['link']] .= " ";
      
          $link_categories[$row['link']] .= $row['category'];
      }
      
      print_r($link_categories);
      

      结果:

      Array
      (
          [http://a.com] =>  test evaluate performance
          [http://b.com] =>  classify reduce
          [http://c.com] =>  allocate
      )
      

      这不是“正确”的做法——实际上应该在 具有一对多关系的单独表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-24
        • 1970-01-01
        • 2011-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多