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

时间:2017-04-05 16:17:21

标签: 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_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");
            }
        }
  1. 我现在的问题是,什么是$ database->查询返回? 因为我想最小化我的SQL查询,我想在二维数组中加载我需要的所有值并对它们进行排序。
  2. 这是可能的,如果可以,怎么样?

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

    2. 还有其他方法可以最小化SQL查询吗?

    3. 问候,谢谢!

1 个答案:

答案 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];
}