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 を 1 つの行として戻したいので、メタ値 2 は a:1:{i:0;a:10:{s:2:"id";i と連結されます。 :338;s:12:"variation_id";...

ただし、me​​ta_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、すべてを2回実行したくないでしょう。

于 2013-02-02T12:59:27.327 に答える