最小化SQL语句? - 堆栈SQL查询?

我正在开发一个扩展插件的WordPress插件脚本。 所以,我的问题是,我必须处理非常低效的数据库,因为我只有第一个普通形式...... </ p>

这就是为什么我被迫 得到这样的值:</ p>

  $ details = $ database-&gt; query(“SELECTmeta_keymeta_value FROM6v8T0_postmeta WHERE post_id ='$ pid'  AND(meta_key喜欢'$ price_meta'或meta_key喜欢'$ price_old_meta'或meta_key喜欢'$ link_meta'或meta_key喜欢'$ shop_meta')“); 

while($ row_meta = $ details-&gt; 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 {
fwri te($ myfile,“不匹配!
”);
}
}
</ code> </ pre>


  1. 我现在的问题是,什么是 $ database-&gt;查询返回?

    因为我想最小化我的SQL查询,我想在二维数组中加载我需要的所有值并对它们进行排序。 </ li>
    </ ol>

    这可能吗?如果可以,怎么做?</ p>


    1. 堆栈SQL查询? - 我说多次选择,删除和插入循环。 是否可以堆叠这些语句并执行4个查询瞬间? - 如果是的话,我可以通常使用 fetch_assoc()</ code>继续我的代码吗? - 因为如果我堆叠删除,插入和选择,我不确定这是否可行... </ p> </ li>

    2. 还有其他方法可以最小化SQL查询吗?</ p> </ li>
      </ ol>

      问候和谢谢!</ p>
      </ div>

展开原文

原文

I'm working on a WordPress Plugin script which extends the plugin. So, my problem is, I have to deal with the database which is pretty inefficient because I have only the first normal form...

This is the reason, why I'm forced to get the values like this:

$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!
");
            }
        }
  1. My question now is, what is $database->query returning? Because I want to minimize my SQL queries I want to load all values I need in a two dimensional array and sort them afterwords.

Is that possible and if yes, how?

  1. Stack SQL queries? - I say multiple times Select, Delete and Insert in a loop. Is it possible to stack those statements and execute one query instant of 4? - And if yes, can I continue in my code with fetch_assoc() normally? - Because I'm not sure if this is possible if I stack Delete, Insert and Select...

  2. Are there any other ways to minimize SQL queries?

Greetings and Thank You!

dongshu7162
dongshu7162 只是因为$database来的其他人不是wordpress数据库对象。这是一个mysqli对象。
3 年多之前 回复

1个回答

First the database structure isn't inefficient, it's a widely used and accepted pattern of storing a list of key/value pairs in the database.

There are two ways you can improve the situation for yourself.

MAPPING ARRAY

This one is probably going to be your best choice, as it's very flexible and doesn't require you to change your queries.

$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

This method makes your query long and needs you to update it everytime you want a new field added.

$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];
}
dongzuoyue6556
dongzuoyue6556 让我们在聊天中继续讨论。
3 年多之前 回复
dongmu5815
dongmu5815 我使用你的代码(复制和粘贴):$ details = $ database-> prepare(“SELECT'meta_key','meta_value'FROM'6v8T0_postmeta'WHER post_id ='$ pid'AND meta_key IN(%s,%s,% s,%s)“,$ price_meta,$ price_old_meta,$ link_meta,$ shop_meta);
3 年多之前 回复
dongshipang8094
dongshipang8094 听起来你还在使用查询而不是准备。
3 年多之前 回复
duanbin198788
duanbin198788 如果我尝试使用你的代码我得到方法调用使用5个参数,但方法签名使用1个参数
3 年多之前 回复
dousheyan0375
dousheyan0375 我更新了答案,以包含$ map的示例。
3 年多之前 回复
douyong4842
douyong4842 对于%s,请查看wordpress代码参考wpdb :: prepare上的文档
3 年多之前 回复
dongshi4773
dongshi4773 $ var = condition? 真假; 就像所谓的三元运算符一样,它就像if($ var){true} else {false}更短。 三元运算符
3 年多之前 回复
drbae3964
drbae3964 我忘记了%s。 那是什么?
3 年多之前 回复
doson1998
doson1998 谢谢你的长篇答案! :) - 但我有一些问题。 我从未使用过映射数组。 我有很多条目值对,标签为$ price_meta,$ link_meta等等。 因此,不同的想法是将这些值保持在一起,这些值是否在一起。这是否适用于您的代码? 这就是为什么我说,我需要一个二维数组......那又是什么呢? 和:'默认值'; 意思?
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐