gpt4 book ai didi

php - 尽量减少 SQL 语句? - 堆栈 SQL 查询?

转载 作者:行者123 更新时间:2023-11-29 10:54:21 25 4
gpt4 key购买 nike

我正在开发一个扩展插件的 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->query 返回什么?因为我想最小化我的 SQL 查询,所以我想将我需要的所有值加载到二维数组中,并在后对它们进行排序。

这可能吗?如果可以,如何实现?

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

  • 还有其他方法可以最大限度地减少 SQL 查询吗?

  • 问候并谢谢您!

    最佳答案

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

    您可以通过两种方法来改善自己的情况。

    MAPPING ARRAY

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

    $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];
    }

    关于php - 尽量减少 SQL 语句? - 堆栈 SQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43236558/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com