【问题标题】:Add non existings columns to mysql query result将不存在的列添加到 mysql 查询结果
【发布时间】:2023-04-09 05:48:01
【问题描述】:

我有一个 PHP 变量 $members,它看起来像这样

$members = [
    [
        "name" => "John",
        "age" => 23
    ],
    [
        "name" => "Sasha",
        "age" => 24
    ],
    [
        "name" => "Asmita",
        "age" => 23
    ]
];

现在我的应用程序根据人们的年龄存储费率,因此有一个具有以下结构的费率表

id age price
1 23 200
2 24 230
3 25 250

所以,我正在遍历所有成员并得到这个最终查询

SELECT * FROM rates WHERE age =23 OR age=24 OR age = 23

它返回以下结果

id age price
1 23 200
3 24 230

我想知道是否有某种方法可以将成员添加到结果集中,以便使用 MYSQL 本身返回所有 3 个成员的结果

id member age price
1 John 23 200
2 Sasha 24 230
1 Asmita 23 200

【问题讨论】:

  • 年龄 23、24 或 23?
  • 我假设您在数据库中也有成员,以及他们的年龄(或者更好的长寿,出生日期)?在这种情况下,请执行 INNER JOIN 查询以一次性获取所有结果
  • @Adyson 不,我在数据库中没有成员,我从表单请求中获取这些成员
  • @jarlh 是的,基本上我通过循环遍历所有成员来添加 or 子句,因此我们有可能在 or 子句中得到重复项
  • @omaresmaeel 我不能,因为我正在从 $_POST 请求中获取这些成员,您是否建议我应该将其插入表中,然后每次都执行连接?

标签: php mysql sql laravel select


【解决方案1】:

SQL 无法读取您的 PHP 变量。它只能从数据库中的表中读取数据,或查询中的文字值。因此,如果您的数据仅在 PHP 变量 $members 中(即未存储在数据库中),这将变得很棘手。

最简单的解决方案是将您的rates 表查询到另一个PHP 变量中,然后将它们合并。您可以将结果限制为输入数据中的年龄值。

<?php

# form input from $_POST
$members = [
    [
        "name" => "John",
        "age" => 23
    ],
    [
        "name" => "Sasha",
        "age" => 24
    ],
    [
        "name" => "Asmita",
        "age" => 23
    ]
];

# make list of ages appearing in the input
$ages = array_map(function($m) { return($m['age']); }, $members);

# list of '?' placeholders, equal in length to the number of ages
$placeholders = implode(',', array_fill(1, count($ages), '?'));

# connect to database
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

# fetch the rates for all specified ages
$stmt = $pdo->prepare("SELECT age, price from rates WHERE age IN ($placeholders)");
$stmt->execute($ages);
$ratesResult = $stmt->fetchAll();

# transform the result into an associative array, mapping age to price
$rates = [];
foreach ($ratesResult as $r) {
  $rates[$r['age']] = $r['price'];
}

# merge the rates into the original array of input data
foreach ($members as &$m) {
  $m['price'] = $rates[$m['age']];
}

print_r($members);

输出:

Array
(
    [0] => Array
        (
            [name] => John
            [age] => 23
            [price] => 200.00
        )

    [1] => Array
        (
            [name] => Sasha
            [age] => 24
            [price] => 230.00
        )

    [2] => Array
        (
            [name] => Asmita
            [age] => 23
            [price] => 200.00
        )

)

【讨论】:

  • 谢谢比尔!我已经为此实施了类似的解决方案
【解决方案2】:

这应该做你想做的事;

$members = [
    [
        "name" => "John",
        "age" => 23
    ],
    [
        "name" => "Sasha",
        "age" => 24
    ],
    [
        "name" => "Asmita",
        "age" => 23
    ]
];

$ages = collect($members)->pluck('age')->unique();

$rates = Rate::whereIn('age',$ages)->get();

$merged = collect($members)->map(function($member) use($rates) {
  
    $member['price'] = $rates->where('age', $member['age'])->first()->price;
    return $member;
      
});

获取唯一的年龄,然后查询数据库的费率,然后映射输入数组,将价格添加到每个成员

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多