【发布时间】:2014-03-08 20:21:07
【问题描述】:
我有两个嵌套查询,第二个在我遍历第一个的结果时运行。我想让 MySQL 服务器代替 PHP 来完成这项工作,但我不知道如何将这两者结合起来。
第一个查询:
SELECT post_id,
MAX(CASE WHEN meta_key = 'size' THEN meta_value END) size,
MAX(CASE WHEN meta_key = 'adlink' THEN meta_value END) adlink,
MAX(CASE WHEN meta_key = 'frontpage' THEN meta_value END) frontpage,
MAX(CASE WHEN meta_key = 'expiration' THEN meta_value END) expiration,
MAX(CASE WHEN meta_key = 'image1' THEN meta_value END) image1,
MAX(CASE WHEN meta_key = 'image2' THEN meta_value END) image2,
MAX(CASE WHEN meta_key = 'image3' THEN meta_value END) image3,
MAX(CASE WHEN meta_key = 'image4' THEN meta_value END) image4,
MAX(CASE WHEN meta_key = 'iframe' THEN meta_value END) iframe,
MAX(CASE WHEN meta_key = 'location' THEN meta_value END) location,
MAX(CASE WHEN meta_key = 'sublocation' THEN meta_value END) sublocation
FROM wp_postmeta WHERE post_id in
(SELECT post_id from wp_postmeta
WHERE meta_value LIKE 'Run Of Site') GROUP BY Post_id
然后,遍历结果,我们从另一个表中获取图像,如'image1'等,只是第一组结果中的post id号:
SELECT meta_value FROM wp_postmeta
WHERE post_id IN
(SELECT meta_value from wp_postmeta
WHERE post_id = " . $row{'post_id'} ." AND meta_key like 'image%')
这里是查看 PHP 迭代的完整代码(我知道它需要更好的格式以提高可读性):
$rosads = mysql_query("SELECT post_id,
MAX(CASE WHEN meta_key = 'size' THEN meta_value END) size,
MAX(CASE WHEN meta_key = 'adlink' THEN meta_value END) adlink,
MAX(CASE WHEN meta_key = 'frontpage' THEN meta_value END) frontpage,
MAX(CASE WHEN meta_key = 'expiration' THEN meta_value END) expiration,
MAX(CASE WHEN meta_key = 'image1' THEN meta_value END) image1,
MAX(CASE WHEN meta_key = 'image2' THEN meta_value END) image2,
MAX(CASE WHEN meta_key = 'image1' THEN meta_value END) image3,
MAX(CASE WHEN meta_key = 'image2' THEN meta_value END) image4,
MAX(CASE WHEN meta_key = 'iframe' THEN meta_value END) iframe,
MAX(CASE WHEN meta_key = 'location' THEN meta_value END) location,
MAX(CASE WHEN meta_key = 'sublocation' THEN meta_value END) sublocation
FROM wp_postmeta WHERE post_id in (SELECT post_id from wp_postmeta WHERE meta_value LIKE 'Run Of Site') GROUP BY Post_id");
if (!$rosads) { // add this check.
die('Invalid query: ' . mysql_error());
}
while ($row = mysql_fetch_array($rosads)) { // ######### ITERATE THROUGH THE LIST
if ($row{'size'} == "Premium"){
if ($row{'iframe'}){
$premium = $premium . '<div name="PREMIUM'.$row{'post_id'}.'" style="float:left;">'.$row{'iframe'}.'</div>'."\n";
}else{
$images = mysql_query("SELECT meta_value FROM wp_postmeta where post_id IN(SELECT meta_value from wp_postmeta WHERE post_id = " . $row{'post_id'} ." AND meta_key like 'image%')");
$premium = $premium . "<div name=\"".$row{'post_id'}."\" class=\"multipleslides\" >";
while ($row2 = mysql_fetch_array($images)) {
$premium = $premium . "\t<a target=\"_blank\" href=\"" . $row{'adlink'} ."\"><img src=\"/wp-content/uploads/" .$row2{'meta_value'} ."\"></a>\r\n";
}
$premium = $premium . "</div><br>";
}
/* ### TEST STUFF ####
echo $row{'post_id'} . ", " . $row{'size'} . ", " . $row{'adlink'} . ", " . $row{'frontpage'} . ", " . $row{'expiration'} . ", " . $row{'image1'} . ", " . $row{'image2'} . ", " . $row{'image3'} . ", " . $row{'image4'} . ", " . 1$row{'location'} . ", " . $row{'sublocation'} . ", " . $row{'iframe'} . "<hr>";
*/
} // ###### END THIS ITERATION ####
【问题讨论】:
-
你想做什么? SO 上的很多人都了解 WordPress 架构,因此它可能有助于说明您的意图。
-
尝试使用现有的 wp_postmeta 表及其结构创建自定义广告插件 - 这是我的第一个错误......创建一个新表会更容易...... :-(