【问题标题】:Split up array into rows将数组拆分为行
【发布时间】:2012-12-18 05:19:27
【问题描述】:

我有一个表,其中包含来自dat_eb_registrants 的值作为行(例如$row[1])和来自水平数组的值,从dat_eb_field_values 中提取,我想将它们拆分,以便我可以将所有内容排序到表我想要的方式。

数据如何放入我的表中:

$count = 0;
while ($row = mysql_fetch_row($result))
{
echo "<tr>";
$myArray[] ="<tr><td>" . $row[9] . "</td><td>"; echo $myArray[$count];
$count++;
echo "</tr>"; 
}

如何从数据库中提取所有数据(是的,我知道它很旧):

SELECT dr.id, dr.first_name, dr.last_name, dr.email, dr.comment, dr.amount, dr.published, dr.transaction_id, dr.register_date, GROUP_CONCAT(df.field_value SEPARATOR '</td><td>') 
   FROM dat_eb_registrants dr 
   LEFT JOIN dat_eb_field_values df 
    ON dr.id=df.registrant_id
   WHERE `event_id` >= 20 AND `event_id` <= 25
   GROUP BY dr.id
   ORDER BY '".$sort."', '".$ascdsc."'

现在,我想将第一个表中的一些行(例如$row[1])和(例如$row[2])垂直放置在数组的中间。我该怎么做?

因为数组一次性填满了我的表格,并且使用$rows,您可以简单地告诉哪些行显示在哪里...

这就是我想要的(代码可能不正确):

while ($row = mysql_fetch_row($result)) {
  echo "<tr>";
echo "<td>"'.$row_table_1[1]'"</td>";
echo "<td>"'.$row_table_1[2]'"</td>";
echo "<td>"'.$row_table_2[35]'"</td>";
echo "<td>"'.$row_table_2[45]'"</td>";
echo "<td>"'.$row_table_1[5]'"</td>";
echo "<td>"'.$row_table_2[6]'"</td>";
echo "</tr>";
}

我曾经这样做过:

echo "<td>"; $result24 = mysql_query("SELECT field_id, field_value FROM dat_eb_field_values WHERE (field_id = 88) AND (registrant_id = $row[0])"); $r24 = mysql_fetch_row($result24); echo $r24[1]; echo "</td>";
echo "<td>"; $result25 = mysql_query("SELECT field_id, field_value FROM dat_eb_field_values WHERE (field_id = 57) AND (registrant_id = $row[0])"); $r25 = mysql_fetch_row($result25); echo $r25[1]; echo "</td>";
echo "<td>" . $row[5] . "</td>";
echo "<td>" . $row[6] . "</td>";

我想做:

echo "<td>" . $rowfromsecondtable[1] . "</td>";
echo "<td>" . $rowfromsecondtable[2] . "</td>";
echo "<td>" . $row[5] . "</td>";
echo "<td>" . $row[6] . "</td>";

(使用我上面给出的代码)

dat_eb_registrants预览:

    |   id   |   first_name   |   last_name   |   email               |
------------------------------------------------------------------------
    |    1   |      Mike      |     Doe       |   mikedoe@hotmail.com |
    |    2   |      John      |     Smith     |   j_smith@hotmail.com |

dat_eb_field_values预览:

field 1 = fav.sport
field 2 = fav. color
field 3 = fav. food

    |   registrant_id   |   field_id  |   field_value    |
----------------------------------------------------------
    |    1              |      1      |     tennis       |
    |    1              |      2      |     green        |
    |    1              |      3      |     spagetti     |
    |    2              |      1      |     hockey       |
    |    2              |      2      |     red          |
    |    2              |      3      |     fish         |

我需要:

first_name  |   id   |   fav.sport   |   last_name   |   fav.food   |
---------------------------------------------------------------------
Mike        |    1   |      Tennis   |     Doe       |   spagetti   |
John        |    2   |      Hockey   |     Smith     |   fish       |

【问题讨论】:

  • 努力理解这个问题。你能提供一个更具体的例子吗?
  • 再一次 :) mysql-extension 已过时,未维护,将在 PHP5.5 中标记为已弃用。使用PDO_MYSQLMySQLiphp.net/en/mysql-connect
  • 我的意思是,您能否提供更具体的数据架构示例听起来好像这在 SQL 中都应该是可能的,可能只是加入你的表并引入一个适当的 ORDER BY 子句......但我看到你已经有一个连接和一个 ORDER BY你的问题中的子句,所以我很困惑。
  • 好的,现在我不能说得更清楚了:)

标签: php mysql arrays html-table row


【解决方案1】:

也许我遗漏了一些东西,但为什么不直接在 SQL 中执行此任务。这基本上是一个枢轴。 MySQL 没有枢轴,但您可以使用带有 CASE 语句的聚合函数:

select r.first_name,
  r.id,
  r.last_name,
  max(case when f.field_id =1 then f.field_value else null end) As FavSport,
  max(case when f.field_id =2 then f.field_value else null end) As FavColor,
  max(case when f.field_id =3 then f.field_value else null end) As FavFood
from dat_eb_registrants r
left join dat_eb_field_values f
  on r.id = f.registrant_id
group by r.first_name, r.id, r.last_name
order by r.id

SQL Fiddle with Demo

查询的结果就是你想要的输出:

| FIRST_NAME | ID | LAST_NAME | FAVSPORT | FAVCOLOR |  FAVFOOD |
----------------------------------------------------------------
|       Mike |  1 |       Doe |   tennis |    green | spagetti |
|       John |  2 |     Smith |   hockey |      red |     fish |

或者您可以在dat_eb_field_values 表上使用多个连接:

select r.first_name,
  r.id,
  r.last_name,
  fSport.field_value FavSport,
  fColor.field_value FavColor,
  fFood.field_value FavFood
from dat_eb_registrants r
left join dat_eb_field_values fSport
  on r.id = fSport.registrant_id
  and fSport.field_id = 1
left join dat_eb_field_values fColor
  on r.id = fColor.registrant_id
  and fColor.field_id = 2
left join dat_eb_field_values fFood
  on r.id = fFood.registrant_id
  and fFood.field_id = 3
order by r.id

SQL Fiddle with Demo。它产生相同的结果。

【讨论】:

    【解决方案2】:

    这并不能回答您的问题,但您可以使用表的列名作为行索引,而不是使用 $row[9]、$row[10] 等。

    $row['first_name'] $row['last_name']

    等等。它会让你的代码更具可读性。

    您可能还想先获取所有数据,然后生成 html 代码。它会看起来更干净。

    例如

    $result24 = mysql_query(sometihng here); 
    $r24 = mysql_fetch_row($result24);
    
    $result25 = mysql_query(sometihng else here); 
    $r25 = mysql_fetch_row($result25);
    
    //php code for table starts here 
    echo '<table>';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 2020-12-30
      • 2023-03-21
      相关资源
      最近更新 更多