我正在开发一个扩展插件的WordPress插件脚本。所以,我的问题是,我必须处理数据库,这是非常低效的,因为我只有第一个正常形式......
这就是为什么我被迫得到这样的值的原因:
$details = $database->query("SELECT `meta_key`, `meta_value` FROM `6v8T0_postmeta` WHERE post_id = '$pid' AND (meta_key like '$price_meta' OR meta_key like '$price_old_meta' OR meta_key like '$link_meta' OR meta_key like '$shop_meta')");
while($row_meta = $details->fetch_assoc()){
if($row_meta["meta_key"] == $price_meta){
$price = $row_meta["meta_value"];
}elseif($row_meta["meta_key"] == $price_old_meta){
$price_old = $row_meta["meta_value"];
}elseif($row_meta["meta_key"] == $link_meta){
$link = $row_meta["meta_value"];
}elseif($row_meta["meta_key"] == $shop_meta){
$shop = $row_meta["meta_value"];
}else{
fwrite($myfile, "Is not matching!\n");
}
}
这是可能的,如果可以,怎么样?
堆栈SQL查询? - 我说多次选择,删除和插入循环。是否可以堆叠这些语句并执行4个查询瞬间? - 如果是的话,我可以正常使用fetch_assoc()
继续我的代码吗? - 因为如果我堆叠删除,插入和选择...我不确定这是否可行
还有其他方法可以最小化SQL查询吗?
问候,谢谢!
答案 0 :(得分:1)
首先,数据库结构效率不高,它是一种广泛使用和接受的模式,用于在数据库中存储键/值对列表。
有两种方法可以改善自己的状况。
映射阵列
这可能是您的最佳选择,因为它非常灵活,不需要您更改查询。
$details = $database->prepare("
SELECT
`meta_key`,
`meta_value`
FROM
`6v8T0_postmeta`
WHERE
post_id = '$pid'
AND meta_key IN (
%s,
%s,
%s,
%s
)
",
array(
$price_meta,
$price_old_meta,
$link_meta,
$shop_meta
)
);
$map = array();
while($row_meta = $details->fetch_assoc()){
$map[$row_meta['meta_key']] = $row_meta['meta_value'];
}
/*
$map will look something like this
array(
'price' => '10.99',
'price_old' => '9.99',
'link' => 'http://example.org/awesome-product',
'shop' => 'main'
)
*/
$price = array_key_exists($price_meta, $map) ? $map[$price_meta] : 'default value';
$price_old = array_key_exists($price_old_meta, $map) ? $map[$price_old_meta] : 'default value';
$link = array_key_exists($link_meta, $map) ? $map[$link_meta] : 'default value';
$shop = array_key_exists($shop_meta, $map) ? $map[$shop_meta] : 'default value';
JOINS
此方法会使您的查询变长,并且每次需要添加新字段时都需要更新它。
$details = $database->prepare("
SELECT
b.meta_value %s,
c.meta_value %s,
d.meta_value %s,
e.meta_value %s
FROM
`6v8T0_postmeta` a
LEFT JOIN
`6v8T0_postmeta` b ON
b.post_id = a.post_id
AND b.meta_key = %s
LEFT JOIN
`6v8T0_postmeta` c ON
c.post_id = a.post_id
AND c.meta_key = %s
LEFT JOIN
`6v8T0_postmeta` d ON
d.post_id = a.post_id
AND d.meta_key = %s
LEFT JOIN
`6v8T0_postmeta` e ON
e.post_id = a.post_id
AND e.meta_key = %s
WHERE
a.post_id = '$pid'
",
array(
$price_meta,
$price_old_meta,
$link_meta,
$shop_meta,
$price_meta,
$price_old_meta,
$link_meta,
$shop_meta,
$price_meta,
$price_old_meta,
$link_meta,
$shop_meta
)
);
$map = array();
if (!($row_meta = $details->fetch_assoc())) {
$price = $row_meta[$price_meta];
$price_old = $row_meta[$price_old_meta];
$link = $row_meta[$link_meta];
$shop = $row_meta[$shop_meta];
}