PHP,2行为1

时间:2013-02-02 12:51:30

标签: php mysql phpmyadmin

由于数据库的组织方式,我无法将正确的结果集合成一行。 我使用以下SQL:

SELECT ord.ID, ord.post_date, ord.post_status, ord.post_type, 
meta.meta_value, term.term_id, term.name, 
SUBSTRING(meta.meta_value,LOCATE('\"id\";i:', meta.meta_value)+7,3) AS prodID,
user.user_email
FROM wp_posts ord
INNER JOIN wp_postmeta meta ON meta.post_id = ord.ID
INNER JOIN wp_term_relationships rel ON ord.ID = rel.object_id 
INNER JOIN wp_terms term on term.term_id = rel.term_taxonomy_id 
LEFT JOIN wp_users user ON user.ID = meta.meta_value
WHERE ord.post_type = 'shop_order'
AND (meta.meta_key = '_customer_user' OR meta.meta_key = '_order_items')
AND ord.post_date >= DATE_SUB(NOW(), INTERVAL 2 HOUR)
AND ord.post_status <> 'trash'
AND term.term_id = 34
ORDER BY `ord`.`ID`  DESC

结果是:

ID Descending   post_date   post_status     post_type   meta_value  term_id     name    prodID  user_email
451     2013-02-02 10:24:00     publish     shop_order  2   34  processing      sales@proxyplayer.co.uk
451     2013-02-02 10:24:00     publish     shop_order  a:1:{i:0;a:10:{s:2:"id";s:3:"339";s:12:"variation_...   34  processing  338     NULL

理想情况下,我想将meta.meta_value作为一行, 因此,元值2将与:1:{i:0; a:10:{s:2:“id”; i:338; s:12:“variation_id”; ...

但是,我不认为我可以在这个实例中这样做,因为meta_value在元表中有2个单独的行。

所以,我认为我可以在PHP中控制它并获得值2和值338。 但是我怎么能在while循环中做到这一点?

while ($squid = mysql_fetch_array($result, MYSQL_ASSOC)) {

//1st row

//2nd row

//processing code

}

我是否在其中添加了一个额外的while循环来跳过db中每2行数据? 我应该将它加载到数组中并循环遍历数组中的2行吗?

2 个答案:

答案 0 :(得分:0)

你需要在PHP中执行此操作是正确的:MySQL不了解PHP的序列化数据格式。

但是,您不需要像您说的那样跳过行。在循环外创建一个存储$ ID的数组 - &gt; meta_data关系。我不知道你想如何连接它们,但请看这个例子。

$squArr = array();
while($squid = mysql_fetch_assoc...) // I'm using fetch assoc so I can use the row names as array indices
{
    $rowID = $squid['ID'];
    $rowMeta = $squid['meta_value'];
    $squArr[$rowID][] = $rowMeta;
}

这里,这将为每个ID创建一个元数据数组。您可以使用不同的操作替换while循环的最后一行中的操作。

答案 1 :(得分:0)

如果要获取数组中的所有行,可以执行以下操作:

$results = array();
while ($squid = mysql_fetch_array($result, MYSQL_ASSOC)) {
  if (isset($results[$squid['ID']))
  {
    // row with index ID already added, modify existing row
    $results[$squid['ID']]['meta_value'] .= ';' . $squid['meta_value'];
  }
  else
  {
    // add new row, using the ID as the index
    $results[$squid['ID']] = $squid;
  }
}

您可能需要在循环之后放置processing code,因为循环中的数据未完成,即使您不使用meta_value,也不希望两次执行任何操作。