我需要帮助来解决一些问题。
我有一些表格levelAsignment
,其中包含level_id
,store_id
和user_id
列。对于每个user_id
,我可以编写一个查询来获取level_id
和store_id
。
我还有一张桌子stores
。
我需要为每个商店获得他的等级并计算当前等级和商店的用户。
这很简单,但问题在于存储数据,因为在levelAsignment
表中,用户可以为某些操作员级别设置所有商店。
看起来像这样:
level_id | store_Id | user_id
4 1 5
1 5 5
6 1
store_id = 1
表中的stores
表示所有商店,所以我需要显示除1之外的所有商店。
select * from stores where id != 1;
所以我需要一个如何组织的建议。
我找到了解决问题的不同方法,但是有很多工会和条件。
答案 0 :(得分:0)
我不确定我是否正确理解了这个问题。但它可能有用:
select la.level_id, la.store_Id, count(la.user_id) from stores s
left join levelAsignment la on (s.id = la.store_id and la.store_id != 1) or (la.store_id = 1 and s.id != 1)
group by (level_id, store_Id)
答案 1 :(得分:0)
这取决于您如何加入商店表
我认为你应该将stores_assignment(其中store_id = 1)加入stores表中的所有数据,但是子查询将外部查询从级别赋值表中排除store_id = 1列。您可能必须在临时表中为存储数据创建连接列。然后联合level_assignment表,其中store_id!= 1
示例:
WITH get_all_stores_for_store_id_1 AS (
SELECT
a.level_assigment,
a.store_id,
b.store_id,
a.user_id
FROM level_assignment a
LEFT JOIN stores b ON a.join_column = b.join_column
WHERE a.store_id = 1)
SELECT
level_assignment,
b.store_id AS store_id,
user_id
FROM get_all_stores_for_store_id_1
UNION
SELECT
level_assignment,
store_id,
user_id
FROM level_assignment
WHERE store_id != 1
这有意义吗?
考虑如何加入数据,我们可以这样做:
获取stores表并创建一个1列,每行包含一个商店,以便我们可以使用store_id = 1将所有商店加入level_assignment表:
WITH set_1_column_in_stores_table AS (
SELECT
1 AS join_id,
store_id,
FROM stores),
all_store_rows_get_all_stores AS (
SELECT
a.level_assigment,
a.store_id,
b.store_id,
a.user_id
FROM level_assignment a
LEFT JOIN set_1_column_in_stores_table b ON a.store_id= b.join_id
-- The above will join all stores where store_id = 1 in level_assigment
WHERE a.store_id = 1)
SELECT
level_assignment,
b.store_id AS store_id,
user_id
FROM all_store_rows_get_all_stores
UNION
SELECT
level_assignment,
store_id,
user_id
FROM level_assignment
WHERE store_id != 1