【问题标题】:How to create an SQL query for the scenario given below? [closed]如何为下面给出的场景创建 SQL 查询? [关闭]
【发布时间】:2013-07-08 12:15:44
【问题描述】:

我有一个名为 $arrResult 的数组。我从复杂的 JOIN SQL 查询中收到了这个数组。供您参考,我在这里打印数组:

Array
(
    [21e86b3ebf6a8af2a9fcf136c4f8e88a] => 1
    [e7e95de96987cc7c89c1f0183110fb38] => 3
    [42eaca88ae0079a77604d75d30846e46] => 1
    [fc55acb1edc47d2dc339562db4c13729] => 1
    [9f27643023a83addd5eed41c4aade840] => 3
    [5810758e0ee945090506e02c35222f0e] => 3
)

如您所见,数组中的键(即test_pack_id)不同,但值(即test_pack_type_id)会重复。在某些情况下,这些值可能是唯一的。

数据库中有一个名为test_packages的表,其字段为test_pack_id,该字段也是该表的主键。 test_pack_id 字段包含来自上述数组的值(即上述数组的键)以及已经存在的其他类似值。此表有另一个名为 test_pack_type_id 的字段,其中包含上述数组中的值(即 1、3 等)

现在,我只想从该表中获取那些记录,其中test_pack_id 不等于上述数组中的test_pack_id,但具有与该特定 test_pack_id 关联的相同test_pack_type_id

此外,要求是获取的 test_pack_ids 应按test_pack_type_id 分组。我尝试了很多技巧来获得所需的结果,但无法获得。谁能帮我得到想要的结果?

表test_packages的结构如下:

test_pack_id       varchar(32)
test_pack_name     varchar(255)
test_pack_desc     text     
test_pack_type_id  smallint(4)

【问题讨论】:

  • 你应该发布你的表结构和sql语句。
  • @jeroen:感谢您的建议。现在我已经添加了表 test_packages 的表结构。
  • 请添加输出应该是什么样子
  • @matino:输出应包含所有 test_packages 根据上述由 test_pack_type_id 分组的标准。简而言之,应该运行对唯一 test_pack_type_id 的查询,但它不应包含上述数组中提到的 test_packages。
  • 如果查询提取test_pack_ids然后使用循环分组就可以了

标签: php mysql sql arrays associative-array


【解决方案1】:

这里我假设您已经从数据库中提取了问题中给出的数组值

$data = Array
        (
            [21e86b3ebf6a8af2a9fcf136c4f8e88a] => 1
            [e7e95de96987cc7c89c1f0183110fb38] => 3
            [42eaca88ae0079a77604d75d30846e46] => 1
            [fc55acb1edc47d2dc339562db4c13729] => 1
            [9f27643023a83addd5eed41c4aade840] => 3
            [5810758e0ee945090506e02c35222f0e] => 3
        );
$sep = "";
$pack_str = "";
$pack_type_arr = array();
foreach($data as $key=>$val)
{
   $pack_str =  $sep.$pack_str;
   if(!in_array($val,$pack_type_arr))
        $pack_type_arr = $val;
   $sep = ",";
}
$pack_type_str = implode(",",$pack_type_arr);
$sql = "SELECT *
          FROM test_packages
          WHERE test_pack_id not in ($pack_str) 
          AND test_pack_type_id IN ($pack_type_str)             
          ORDER BY test_pack_type_id ASC";

//then execute the query and extract the resource in variable(say $query) 
while($row = mysql_fetch_assoc($query))
{
    $output[$row['test_pack_type_id']][] = $row['test_pack_id'];
}
//Thus $output gives you the key(test_pack_type_id) value(test_pack_id) association

我希望这能有所帮助。

【讨论】:

    【解决方案2】:
    SELECT DISTINCT test_pack_id,
                    test_pack_type_id,
    FROM test_packages
    WHERE test_pack_id not in ('21e86b3ebf6a8af2a9fcf136c4f8e88a', 'e7e95de96987cc7c89c1f0183110fb38', ...)
    GROUP BY test_pack_type_id
    ORDER BY test_pack_type_id ASC;
    

    希望我正确理解了要求:)

    【讨论】:

    • :这行不通,因为我不想提取 test_pack_type_id 并且 test_pack_ids 的值以静态格式传递。它们应该动态传递。
    • 是的,但是您可以使用 php.ini 准备 SQL 查询。像@saran 这样的例子已经在他的例子中展示出来了。
    猜你喜欢
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 2017-08-19
    • 1970-01-01
    相关资源
    最近更新 更多