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循环中做到这一点?

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

//1st row

//2nd row

//processing code

}

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

4

2 回答 2

0

您需要在 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 循环最后一行中的操作替换为不同的操作。

于 2013-02-02T12:57:32.217 回答
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,您也不想做所有事情两次。

于 2013-02-02T12:59:27.327 回答