【问题标题】:Change output style of while loop更改while循环的输出样式
【发布时间】:2011-06-22 18:42:31
【问题描述】:

我有一个 while 循环从 MySQL 数据库获取信息,通过 php 输出信息。我的代码是这样的:

while($row = mysql_fetch_array($result)) {
  $output .= '<tr>' . "\r";
  $output .= '<td>' . $row['lnID'] . '</td>' . "\r";
  $output .= '<td>' . $row['lnLine'] . '</td>' . "\r";
  $output .= '<td>' . $row['lnTitle'] . '</td>' . "\r";
  $output .= '<td>' . $row['cLongName'] . '</td>' . "\r";
  $output .= '</tr>' . "\r";
}

cLongName 可以在数据库中有多个条目,因此它以这种形式输出数据:

lnID  | lnLine  | lnTitle  | cLongName
---------------------------------------
lnID1 | lnLine1 | lnTitle1 | cLongname1
lnID1 | lnLine1 | lnTitle1 | cLongname2
lnID1 | lnLine1 | lnTitle1 | cLongname3
lnID2 | lnLine2 | lnTitle2 | cLongname1
lnID2 | lnLine2 | lnTitle2 | cLongname2
lnID2 | lnLine2 | lnTitle2 | cLongname3
lnID2 | lnLine2 | lnTitle2 | cLongname4
lnID2 | lnLine2 | lnTitle2 | cLongname5

我想要这种格式的数据:

lnID  | lnLine  | lnTitle  | cLongName
---------------------------------------------------------------------------------------
lnID1 | lnLine1 | lnTitle1 | cLongname1, cLongname2, cLongname3
lnID2 | lnLine2 | lnTitle2 | cLongname1, cLongname2, cLongname3, cLongname4, cLongname5

我尝试在我的 while 循环中插入一个 foreach 循环,但没有成功。任何想法或帮助将不胜感激。

-- 编辑--

我的 MySQL 查询如下:

$result = mysql_query("
  SELECT
    pcdb_line.lnID, pcdb_line.lnLine, pcdb_line.lnTitle,
    pcdb_colourways.cwLine, pcdb_colourways.cwColID1,
    pcdb_colour_name.cID, pcdb_colour_name.cLongName, pcdb_colour_name.cHex
  FROM pcdb_line
  GROUP BY pcdb_line.lnID
  LEFT JOIN pcdb_colourways
  ON (pcdb_line.lnID = pcdb_colourways.cwLine)
  LEFT JOIN pcdb_colour_name
  ON (pcdb_colour_name.cID = pcdb_colourways.cwColID1)
  LIMIT 50
");

根据 ADW 的回答,我仅在 cLongName 和所有 pcdb_colour_name 上尝试了 group_concat,但它没有给我任何输出。

-- 编辑 2--

SELECT 查询更改为:

  $result = mysql_query("
    SELECT
      pcdb_line.lnID, pcdb_line.lnLine, pcdb_line.lnTitle,
      pcdb_colourways.cwLine, pcdb_colourways.cwColID1,
      pcdb_colour_name.cID, group_concat(pcdb_colour_name.cLongName) AS cLongNames, pcdb_colour_name.cHex
    FROM pcdb_line
    LEFT JOIN pcdb_colourways
    ON (pcdb_line.lnID = pcdb_colourways.cwLine)
    LEFT JOIN pcdb_colour_name
    ON (pcdb_colour_name.cID = pcdb_colourways.cwColID1)
    GROUP BY pcdb_line.lnID
    LIMIT 50
  ");

允许我在我的 php 上使用 $output .= "\t\t" . '&lt;td&gt;' . $row['cLongNames'] . '&lt;/td&gt;' . "\r";,给我所需的输出。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    您最好将数据库查询修改为:

    select lnID,lnLine,lnTitle,group_concat(cLongName) from table group by lnID,lnLine,lnTitle;
    

    【讨论】:

    • +1 太棒了,从来不知道group_concat 存在。肯定会使用它。
    • 最好是group_concat(cLongName) as cLongNames,这样就可以访问了吗?
    • 这对我来说似乎是一个很好的答案,我只是有点迷茫我需要如何格式化我的 select 查询。我已经把它放在Q里了,所以如果你能看一下并告诉我,那就太好了。如果您需要更多信息,请告诉我。
    【解决方案2】:

    作为@ADW 答案的额外说明,如果您使用整数,您可能需要先输入类型:

    select lnID,lnLine,lnTitle,group_concat(CAST(cLongName as CHAR)) as cLongNames from table group by lnID,lnLine,lnTitle;
    

    然后你会使用它:

    $result = mysql_query("
      SELECT
        pcdb_line.lnID, pcdb_line.lnLine, pcdb_line.lnTitle,
        pcdb_colourways.cwLine, pcdb_colourways.cwColID1,
        pcdb_colour_name.cID, group_concat( pcdb_colour_name.cLongName ) as cLongNames, pcdb_colour_name.cHex
      FROM pcdb_line
      GROUP BY pcdb_line.lnID
      LEFT JOIN pcdb_colourways
      ON (pcdb_line.lnID = pcdb_colourways.cwLine)
      LEFT JOIN pcdb_colour_name
      ON (pcdb_colour_name.cID = pcdb_colourways.cwColID1)
      LIMIT 50
    ");
    

    然后你可以$row['cLongNames']访问它

    【讨论】:

    • 平心而论,我认为@ADW 应该得到正确答案,我只是在扩展它。
    • 我砍了几次,改了几次——当然是你改进了,但我会支持大多数(和你的)决定。很尊贵! :-)
    • 呵呵,别担心。嗯,我从你的回答中学到了一些东西,所以一切都很好。
    猜你喜欢
    • 2015-09-30
    • 1970-01-01
    • 2012-01-02
    • 2013-09-28
    • 1970-01-01
    • 2020-08-28
    • 2018-08-13
    • 2017-09-26
    • 1970-01-01
    相关资源
    最近更新 更多