我在这个问题上略微挠了头,我确信这是非常基本的,但它已经有点了。
如果我有一个基本上具有如下结构的双列表:
表: 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
)
等?
答案 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
实现此目的。