Php 最小化SQL语句?-堆栈SQL查询?
我正在编写一个WordPress插件脚本来扩展插件。所以,我的问题是,我必须处理数据库,这是非常低效的,因为我只有第一个范式 这就是为什么我不得不得到这样的值:Php 最小化SQL语句?-堆栈SQL查询?,php,mysql,sql,sql-server,wordpress,Php,Mysql,Sql,Sql Server,Wordpress,我正在编写一个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_ol
$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");
}
}
fetch\u assoc()
继续我的代码吗因为如果我堆叠删除、插入和选择,我不确定这是否可行你好,谢谢 首先,数据库结构不是低效的,它是一种广泛使用和接受的在数据库中存储键/值对列表的模式 有两种方法可以改善自己的处境 映射数组 这可能是您的最佳选择,因为它非常灵活,不需要您更改查询
$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';
加入
此方法会使查询变长,并且每次需要添加新字段时都需要更新查询
$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];
}
谢谢你冗长的回答!:)-但我有一些问题。我从未使用过映射数组。我有很多条目和值对,标签是
$price\u meta
,$link\u meta
等等。所以,不同的想法是将那些属于一起的价值观保持在一起。。这与您的代码一起工作吗?这就是为什么我说,我需要一个二维数组。。。而?
和:“默认值”代码>意思?我忘了%s
。这是为了什么?$var=条件?真:假
是所谓的三元运算符,它就像做if($var){true}else{false}
一样,只是短得多。对于%s,请查看wordpress上的文档。我更新了答案,以包括$map
的外观示例。对于使用$database的其他人,wordpress数据库对象不是。这是一个mysqli对象。