MYSQL查询 - 基于同一表中另一列中的DISTINCT值从一列返回所有值的简单方法?

时间:2015-04-09 15:16:32

标签: php mysql sql database pdo

我在这个问题上略微挠了头,我确信这是非常基本的,但它已经有点了。

如果我有一个基本上具有如下结构的双列表:

表: customer_per_store

pid, store_id

其中pid是唯一键,store_id可以有多个重复值:

E.g。

1, 500
2, 500
3, 500
4, 505
5, 505
7, 0
8, 500
9, 0

对于将所有pid抓取到DISTINCT store_id的结果的正确查询是什么,但我们忽略值为0的store_ids?

这很容易吗?我觉得这很荒谬吗?

我想我可以在两个语句中完成它,首先我得到所有DISTINCT store_ids,将结果保存到数组然后循环遍历该数组,为每个store_id执行查询并保存结果。

虽然在单个mysql查询中有更简单的方法吗?

理想情况下,在单个查询中,我可以获得如下结果:

[500] => Array(
   [0] => 1,
   [1] => 2,
   [2] => 3
   ...
), 
[505] => Array(
   [0] => 4,
   [1] => 5
)

等?

4 个答案:

答案 0 :(得分:2)

我假设您因为调试输出而使用php。

我认为你只想将结果堆叠在一个关联数组中,其中键是store_id。此示例使用mysqli_query但您可以将其修改为pdo。

$results_by_store_id = array();
$rs = mysqli_query("select * from customer_per_store where store_id <> 0");
while($r = mysqli_fetch_assoc($rs)) {
    $results_by_store_id[$r['store_id']][] = $r['pid'];
}

print_r($results_by_store_id);

答案 1 :(得分:1)

我想你只想要group_concat()

select store_id, group_concat(pid)
from table t
where store_id <> 0
group by store_id;

答案 2 :(得分:1)

听起来你正在尝试使用错误的工具来完成工作,如果使用GROUP BY变体,你仍然需要将数据发布到数组中。

您想要的查询非常简单:

  SELECT store_id, pid
    FROM table t
   WHERE store_id != 0

然后使用您选择的语言运行生成的assoc数组并构建您想要的数组..这里是一些PHP代码:

$processed = [];
foreach($fetched as $row){
  $processed[$row['store_id']][] = $row['pid']
}

答案 3 :(得分:0)

你不想要像SELECT pid, store_id FROM <your_database> WHERE store_id > 0 GROUP BY store_id这样的东西吗?

这会将所有在该store_id下具有不同store_id的pid分组。

这可能不是您想要的确切查询,但我绝对认为您可以使用GROUP BY实现此目的。