如何使用分隔列和值的数组生成查询

Posted

技术标签:

【中文标题】如何使用分隔列和值的数组生成查询【英文标题】:How to generate a query using an array of delimited columns & values 【发布时间】:2017-10-04 18:58:57 【问题描述】:

我有这个数组:

$filter=['color*black','color*blue','color*red','paint*apex','paint*dalton'];

$filter 中的每个值都有两个由* 分隔的子字符串。第一个子字符串表示数据库表列,第二个子字符串表示该列的所需值。

我的products 表如下所示:

id    name    color    paint
1     p1      black     compo
2     p2      red       dalton
3     p3      pink      apex
4     p4      blue      apex
5     p5      cream     compo

使用$filter,我需要搜索products 表并返回paint 值为apexdaltoncolor 值为blackblue 的所有行,或red

所需的输出是一个只返回这些行的 mysql 查询:

id    name    color    paint
2     p2      red       dalton
4     p4      blue      apex

【问题讨论】:

【参考方案1】:

如果您需要像SELECT * FROM products WHERE (color IN ('black', 'blue', 'red')) AND (paint IN ('apex', 'dalton')) 这样构造一个查询,那么下面的代码可能会有用(请检查它here):

$filter = array(
    0 => "color*black",
    1 => "color*blue",
    2 => "color*red",
    3 => "paint*apex",
    4 => "paint*dalton"
);

$elements = [];

foreach ($filter as $value) 
    list($before, $after) = explode('*', $value);
    $elements[$before][] = $after;


$parts = [];

foreach ($elements as $column => $values) 
    $parts[] = "(`$column` IN ('" . implode("', '", $values) . "'))";


$query = 'SELECT * FROM `products` WHERE ' . implode(' AND ', $parts);

针对给定的表数据结构运行此查询:

id    name    color    paint
1     p1      black     compo
2     p2      red       dalton
3     p3      pink      apex
4     p4      blue      apex
5     p5      cream     compo

将匹配以下行:

2     p2      red       dalton
4     p4      blue      apex

【讨论】:

你能用给定的表结构和条目运行这个吗? @abilasher 我已经检查过your question,但很遗憾无法帮助您。【参考方案2】:

这里我们使用explodeforeacharray_values 来实现所需的输出。

Try this code snippet here

<?php

$filter = array(
    0 => "color*black",
    1 => "color*blue",
    2 => "color*red",
    3 => "paint*apex",
    4 => "paint*dalton");

$result=array();
foreach($filter as $value)

    list($before,$after)=explode("*",$value);
    $result["before"][$before]=$before;
    $result["after"][$after]=$after;

$result["before"]=  array_values($result["before"]);
$result["after"]=  array_values($result["after"]);
print_r($result);

输出:

Array
(
    [before] => Array
        (
            [0] => color
            [1] => paint
        )
    [after] => Array
        (
            [0] => black
            [1] => blue
            [2] => red
            [3] => apex
            [4] => dalton
        )
)

【讨论】:

能否请您告诉我如何执行 sql 操作。 @abilasher 你可以试试这个。eval.in/788364 在我给出的最后一个 SQL 查询中,或者我已将其更改为颜色和油漆之间的 AND 条件。

以上是关于如何使用分隔列和值的数组生成查询的主要内容,如果未能解决你的问题,请参考以下文章

如何从给定数组的范围查询中获取给定值的最小异或值

如何拆分列包括键和值到postgres中的单独列中

按列和值比较两个 csv 文件并显示不同值的行号 [关闭]

如何使用php更新mongodb中具有键和值的子文档

如何使用php更新mongodb中具有键和值的子文档

在 Python 3.x 中将基于特定列的列和值的两个 DataFrame 与 Pandas 合并