PHP, 2 rows into 1



由于数据库的组织方式,我无法将正确的结果集放入 1 行。我使用以下 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 将与 a:1:{i:0;a:10:{s:2:"id";i:338;s:12:"variation_id";...

但是,我认为在这种情况下我不能这样做,因为meta_value在元表中有 2 个单独的行。

所以,我认为我可以在 PHP 中控制它并获取值 2 和值 338。但是我怎样才能在一段时间内做到这一点呢?

while ($squid = mysql_fetch_array($result, MYSQL_ASSOC)) {
//1st row
//2nd row
//processing code
}

我是否在其中放置了一个额外的 while 循环以跳过数据库中每 2 行数据?我应该将其加载到数组中并通过数组中的 2 行循环吗?

你是对的,你需要在PHP中做到这一点:MySQL不理解PHP的序列化数据格式。

但是,您不需要像您所说的那样跳过行。在循环外部创建一个数组,该数组将存储$ID -> 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 循环最后一行中的操作替换为其他操作。

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

$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,您也不想对所有事情执行两次。

最新更新