Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 最小化SQL语句?-堆栈SQL查询?_Php_Mysql_Sql_Sql Server_Wordpress - Fatal编程技术网

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

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

我正在编写一个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");
            }
        }
  • 我现在的问题是,$database->query返回什么? 因为我想最小化我的SQL查询,所以我想在一个二维数组中加载我需要的所有值,并在后面对它们进行排序 这可能吗?如果可能,如何实现

  • 堆栈SQL查询?-我说在循环中多次选择、删除和插入。是否可以堆叠这些语句并执行一个4的查询瞬间如果是,我可以正常地使用
    fetch\u assoc()
    继续我的代码吗因为如果我堆叠删除、插入和选择,我不确定这是否可行

  • 有没有其他方法可以最小化SQL查询


  • 你好,谢谢

    首先,数据库结构不是低效的,它是一种广泛使用和接受的在数据库中存储键/值对列表的模式

    有两种方法可以改善自己的处境

    映射数组

    这可能是您的最佳选择,因为它非常灵活,不需要您更改查询

    $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对象。