【问题标题】:MySQL Complex SELECT Query - JOINSMySQL 复杂的 SELECT 查询 - JOINS
【发布时间】:2012-11-13 02:37:07
【问题描述】:

请找到 SQLfiddle 网址:

http://sqlfiddle.com/#!2/c8002/1/0

实际输出应该是:

region_id   status1         branches        balance     fses
    status0         discount     branch_names       telecallers
2   NULL    4       400.00  30   KOTTAKKAL  341.00  3   3
2   NULL    4       800.00  31   KALPETTA   394.00  3   3

我得到的重复输出如下:

region_id   status1         branches        balance     fses
    status0         discount     branch_names       telecallers
2   NULL    4       400.00  30   KOTTAKKAL  341.00  3   3
2   NULL    4       400.00  30   KOTTAKKAL  394.00  3   3 
2   NULL    4       800.00  31   KALPETTA   341.00  3   3
2   NULL    4       800.00  31   KALPETTA   394.00  3   3

我该如何纠正?

感谢和问候, 曼杰什。

【问题讨论】:

  • 从 (...) 中选择不同的 (...) ... ?
  • 在你的余额栏中,你不认为 KALPETTA 应该有 341
  • @Rubens 你能发布完整的查询吗?
  • @SashiKant 请执行以下查询以了解结果: SELECT IEX.region_id,B.branch_id as branches, B.branch_name as branch_names,sum( RGD.recipt_bal_amount ) AS balance FROM tbl_insurance_excel IEX 左连接 tbl_recipt_general_details RGD ON IEX.id = RGD.insurance_excel_id 左连接 tbl_branches B ON B.branch_id = RGD.policy_closed_branch WHERE IEX.region_id =2 GROUP BY B.branch_id
  • 你希望有人破译那个 21-join 查询吗?

标签: mysql select join


【解决方案1】:

我猜你的查询结构本身有问题,因为它不仅仅是对distinct 的请求。

您的连接表,并为您拥有的每一行检索不同的值,您实际上只想为 KOTTAKKALKALPETTA 中的每一个提供一个。

请注意,在您的示例中,尽管添加了子句 distinct,但不会出现任何差异,因为您拥有的行 是不同的。在列平衡中,KOTTAKKALKALPETTA 的每个条目都有 341.00394.00

如果使用组,是的,您将丢失有关balance 的信息,因为group by 之后返回的结果只是分组的不同元素中的第一个(如果列具有多个值)。

您要么必须确定您想要的结果,要么应对在balance 列上进行其他计算。

我猜结果,你愿意做的正确加入是这样的:

SELECT DISTINCT E.`region_id`,a0.status0,a1.status1,k.discount,k.branches
,k.branch_names, k.balance,TCLRS.telecallers,FSE.fses

FROM tbl_insurance_excel E


LEFT OUTER JOIN (SELECT E2.region_id, count(`id`) AS status1
FROM tbl_insurance_excel E2 LEFT JOIN  tbl_recipt_general_details ON id=insurance_excel_id
JOIN tbl_branches  ON policy_closed_branch= branch_id
WHERE E2.`row_status` =1 AND E2.canceled_status='no' AND E2.region_id=2   GROUP BY region_id) a1 ON a1.region_id=E.region_id

LEFT OUTER JOIN (SELECT E2.region_id, count(`id`) AS status0
FROM tbl_insurance_excel E2 LEFT JOIN  tbl_recipt_general_details ON id=insurance_excel_id
JOIN tbl_branches  ON policy_closed_branch= branch_id
WHERE E2.`row_status` =0 AND E2.canceled_status='no' AND E2.region_id=2   GROUP BY region_id) a0 ON a0.region_id=E.region_id

LEFT JOIN (
SELECT IEX.region_id, B.branch_name AS branch_names, B.branch_id AS branches, sum( DDT.discounts_amount ) AS discount, sum( RGD.`recipt_bal_amount` ) AS balance
FROM tbl_insurance_excel IEX
LEFT JOIN tbl_recipt_general_details RGD ON IEX.id = RGD.insurance_excel_id
LEFT JOIN tbl_discounts_details DDT ON RGD.rec_gene_id = DDT.recipt_general_id
LEFT JOIN tbl_branches B ON B.branch_id = RGD.policy_closed_branch
WHERE IEX.region_id =2
GROUP BY B.branch_id)k ON k.region_id=E.region_id

LEFT JOIN (
SELECT ex.region_id, B.branch_id AS branches, count( F.`fse_id` ) AS telecallers
FROM tbl_branches B
LEFT JOIN tbl_team_leader L ON B.branch_id = L.leader_branch_id
LEFT JOIN tbl_fse F ON L.leader_id = F.leader_id
JOIN (

SELECT region_id
FROM tbl_insurance_excel
WHERE `region_id` =2
GROUP BY region_id
) AS ex ON B.region_id = ex.region_id
WHERE F.fse_category = 'Telecaller'
GROUP BY B.branch_id
) TCLRS ON  TCLRS .region_id=E.region_id


LEFT JOIN (
SELECT ex.region_id, B.branch_id AS branches, count( F.`fse_id` ) AS fses
FROM tbl_branches B
LEFT JOIN tbl_team_leader L ON B.branch_id = L.leader_branch_id
LEFT JOIN tbl_fse F ON L.leader_id = F.leader_id
JOIN (

SELECT region_id
FROM tbl_insurance_excel
WHERE `region_id` =2
GROUP BY region_id
) AS ex ON B.region_id = ex.region_id
WHERE F.fse_category = 'Fse'
GROUP BY B.branch_id
) FSE ON  FSE.region_id=E.region_id


  WHERE E.region_id=2 GROUP BY  k.branches

请注意,您正在一个接一个地进行连接,并组合查询中应该唯一的结果。您已将来自您命名为 k 的查询的数据连接起来,然后将结果与您命名为 BAL 的查询连接起来,除了 balance 列之外,具有相同的条目,因此 branch_id's被复制了。

你有,很快:

k.branch_id LEFT JOIN BAL.branch_id

这导致您的行被重复,具有不同的balance 值。

发布的查询得到的结果是:

REGION_ID   STATUS0 STATUS1 DISCOUNT    BRANCHES    BRANCH_NAMES    BALANCE TELECALLERS FSES
2   (null)  4   400 30  KOTTAKKAL   341 3   3
2   (null)  4   800 31  KALPETTA    394 3   3

问候!

【讨论】:

  • 非常感谢,得到了实际输出。
  • 非常欢迎您;在编写查询时请注意不要重复可以同时执行的搜索——在这种情况下,这会导致您遇到这个挑剔的问题。问候!
  • 感谢您的建议,以后我一定会处理此类问题。
【解决方案2】:

试试这个 ::

在您的查询中,只需附加以下部分:

GROUP BY branch_names

或者您可以在 SELECT 部分中获得 DISTINCT:

Select DISTINCT(branch_names) from....

最终查询将是 ::

SELECT E.`region_id`,a0.status0,a1.status1,k.discount,k.branches
,k.branch_names,BAL.balance,TCLRS.telecallers,FSE.fses

FROM tbl_insurance_excel E


LEFT OUTER JOIN (Select E2.region_id, count(`id`) as status1
from tbl_insurance_excel E2 Left Join  tbl_recipt_general_details on id=insurance_excel_id
JOIN tbl_branches  on policy_closed_branch= branch_id
Where E2.`row_status` =1 AND E2.canceled_status='no' and E2.region_id=2   Group by region_id) a1 ON a1.region_id=E.region_id

LEFT OUTER JOIN (Select E2.region_id, count(`id`) as status0
from tbl_insurance_excel E2 Left Join  tbl_recipt_general_details on id=insurance_excel_id
JOIN tbl_branches  on policy_closed_branch= branch_id
Where E2.`row_status` =0 AND E2.canceled_status='no' and E2.region_id=2   Group by region_id) a0 ON a0.region_id=E.region_id

LEFT JOIN (
SELECT IEX.region_id,B.branch_name as branch_names,B.branch_id as branches, sum( DDT.discounts_amount ) as discount
FROM tbl_insurance_excel IEX
LEFT JOIN tbl_recipt_general_details RGD ON IEX.id = RGD.insurance_excel_id
LEFT JOIN tbl_discounts_details DDT ON RGD.rec_gene_id = DDT.recipt_general_id
LEFT JOIN tbl_branches B ON B.branch_id = RGD.policy_closed_branch
WHERE IEX.region_id =2
GROUP BY B.branch_id)k on k.region_id=E.region_id

LEFT JOIN (
SELECT IEX.region_id,B.branch_id as branches, sum( RGD.`recipt_bal_amount` ) AS balance
FROM tbl_insurance_excel IEX
LEFT JOIN tbl_recipt_general_details RGD ON IEX.id = RGD.insurance_excel_id
LEFT JOIN tbl_branches B ON B.branch_id = RGD.policy_closed_branch
WHERE IEX.region_id =2
GROUP BY B.branch_id)BAL ON BAL.region_id=E.region_id

LEFT JOIN (
SELECT ex.region_id, B.branch_id AS branches, count( F.`fse_id` ) AS telecallers
FROM tbl_branches B
LEFT JOIN tbl_team_leader L ON B.branch_id = L.leader_branch_id
LEFT JOIN tbl_fse F ON L.leader_id = F.leader_id
JOIN (

SELECT region_id
FROM tbl_insurance_excel
WHERE `region_id` =2
GROUP BY region_id
) AS ex ON B.region_id = ex.region_id
WHERE F.fse_category = 'Telecaller'
GROUP BY B.branch_id
) TCLRS ON  TCLRS .region_id=E.region_id


LEFT JOIN (
SELECT ex.region_id, B.branch_id AS branches, count( F.`fse_id` ) AS fses
FROM tbl_branches B
LEFT JOIN tbl_team_leader L ON B.branch_id = L.leader_branch_id
LEFT JOIN tbl_fse F ON L.leader_id = F.leader_id
JOIN (

SELECT region_id
FROM tbl_insurance_excel
WHERE `region_id` =2
GROUP BY region_id
) AS ex ON B.region_id = ex.region_id
WHERE F.fse_category = 'Fse'
GROUP BY B.branch_id
) FSE ON  FSE.region_id=E.region_id



 where E.region_id=2 group by  k.branches

【讨论】:

  • 上述查询无法解决,因为正在丢失余额数据。如何在查询中检查 group by 和 distinct?你能用它发布查询吗?
  • 感谢您的时间和帖子。得到鲁本回答的确切输出。
【解决方案3】:

您是否尝试用另一个选择包装您的查询并按 BRANCH_NAMES 对其进行分组

SELECT * FROM
(
    << your query goes here>>
) o
GROUP BY o.BRANCH_NAMES

但是如果你把你的结果像这样放在一起,你肯定会在余额列中丢失数据。

【讨论】:

  • 是的,余额数据丢失了。
  • 但是平衡重要吗?如果是这样,您将无法生成您在问题中询问的输出。余额栏中的金额总是不同的。
  • 是的,余额列与其他列一样重要。
  • 感谢您的时间和帖子。得到鲁本回答的确切输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
相关资源
最近更新 更多