【发布时间】:2021-09-24 11:21:28
【问题描述】:
我有 4 张桌子:T1 {id, user_name, email, telephone, created_at, updated_at} T2 {id, menu_name, town, district, t1_foreign, view_budget, view_menu, created_at, updated_at} T3 {id, t2_foreign, menu_item_name, ingredients, calories, cost_ex, cost_in, selling_in, selling_ex, image_dir, img_caption, view_item, created_at, updated_at} T4 {id, t1_foreign, t2_foreign, created_at, updated_at}
来自T1 的用户链接到T2 中T2.t1_foreign 上的菜单。最初的想法是,只有作为区域代表的链接用户才能看到表 T3 中菜单项的成本。但这种情况发生了变化,因此创建了表 T4 以将其他用户链接到 T4.t2_foreign 和 T4.t1_foreign 上的 T2,因此他们还可以查看特定菜单的成本。
我正在尝试创建一个摘要查询,以便查看菜单的信息以及链接用户的数量,但我得到重复的聚合 COUNT。我发现这是由于T2 具有相同别名的双重联接,但似乎无法解决这个问题。
SELECT t2.id t2.menu_name, t2.town, t2.district, t2.view_menu, t2.view_budget,
IF(COUNT(t4.t2_foreign)=0, "1", CONCAT("1+", COUNT(t4.t2_foreign), " Others")) AS linked, // <=== aggregate function
GREATEST(t2.updated_at, t2.created_at, COALESCE(t3.updated_at, \'1000-01-01\'), COALESCE(t3.created_at, \'1000-01-01\')) AS newest
FROM T2 AS t2
LEFT JOIN T3 AS t3
ON (t3.t2_foreign = t2.id)
INNER JOIN T1 AS t1
ON (t2.t1_foreign = t1.id)
LEFT JOIN T4 AS t4
ON (t4.t2_foreign = t2.id) // this creates duplicate count
GROUP BY t2.id
ORDER BY (newest, ASC)
我已经尝试过子查询连接
SELECT t2.id t2.menu_name, t2.town, t2.district, t2.view_menu, t2.view_budget,
tt.linked,
GREATEST(t2.updated_at, t2.created_at, COALESCE(t3.updated_at, \'1000-01-01\'), COALESCE(t3.created_at, \'1000-01-01\')) AS newest
FROM T2 AS t2
LEFT JOIN T3 AS t3
ON (t3.t2_foreign = t2.id)
INNER JOIN T1 AS t1
ON (t2.t1_foreign = t1.id)
LEFT JOIN (
SELECT IF(COUNT(t4.t2_foreign)=0, "1", CONCAT("1+", COUNT(t4.t2_foreign), " Others")) AS linked
FROM T4
) AS t4 ON (t4.t2_foreign = t2.id) // this give not unique table/alias error
GROUP BY t2.id
ORDER BY (newest, ASC)
有人可以为我指出正确的方向以获得正确的汇总 COUNT 结果吗?
更新:结果虽然不是预期的
在摆弄了我的子查询工作之后,我得到了它来返回一个结果,但结果是所有记录的聚合,而不是每条记录的聚合。不得不将其更改为:
LEFT JOIN (
SELECT IF(COUNT(t4.t2_foreign)=0, "1", CONCAT("1+", COUNT(t4.t2_foreign), " Others")) AS linked, t4.t2_foreign
FROM T4 as t4
) AS tt ON (tt.t2_foreign = t2.id)
虽然在正确的轨道上。
【问题讨论】:
-
聚合而不是连接或使用相关子查询。
-
如何先聚合再加入?
-
当然是在子查询中聚合。
标签: mysql count left-join inner-join aggregate-functions