left-join不获取所有记录

gc0ot86w  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(296)

这个问题在这里已经有答案了

左外联接不返回左表中的所有行(3个答案)
9个月前关门了。
我试图通过使用left join从我的表(组、fiches、客户机、目标、facture)中获取所有记录以获取结果,如果用户id不存在(例如:没有为membre分配目标),则获取0。我不知道我是否有效地解释了,但下面是我的查询:

select CONCAT(s.firstname, ' ', s.lastname) AS Membre, g.achievement AS Objectif, count(l.assigned) AS `num_l`, count(c.id_fiche) AS `num_c`,
(count(c.id_fiche)/count(l.assigned))*100 AS `perc`, SUM(f.total) AS `glob`, (g.achievement - SUM(f.total)) AS `rest`, (SUM(f.total)/g.achievement)*100 AS `taux` 
from `groups` s 
LEFT JOIN `fiches` l ON s.id_membre=l.assigned LEFT JOIN `clients` c ON l.id=c.id_fiche 
LEFT JOIN `goals` g ON s.id_membre=g.id_membre LEFT JOIN `factures` f ON s.id_membre=f.addedfrom 
WHERE l.dateassigned BETWEEN  '2020-08-01' AND '2020-08-31' AND f.status=2 
GROUP BY s.id_membre

我在结果中得到的只是为其分配了目标的成员,但我需要的是所有成员,并且没有为其分配目标的成员在与目标相关的字段中得到0。谢谢您。

oprakyz7

oprakyz71#

这个 LEFT JOIN 很好。你选择把它变成一个 INNER JOIN 通过添加 WHERE 条款。
使用时 LEFT JOIN ,除第一个表外,所有表的筛选条件都应在 ON 条件。

select CONCAT(s.firstname, ' ', s.lastname) AS Membre, g.achievement AS Objectif, 
       count(l.assigned) AS `num_l`, count(c.id_fiche) AS `num_c`, 
       (count(c.id_fiche)/count(l.assigned))*100 AS `perc`, SUM(f.total) AS `glob`, (g.achievement - SUM(f.total)) AS `rest`,
      (SUM(f.total)/g.achievement)*100 AS `taux`
from `groups` s LEFT JOIN
     `fiches` l
     ON s.id_membre = l.assigned AND
        l.dateassigned BETWEEN '2020-08-01' AND '2020-08-31' LEFT JOIN
     `clients` c
     ON l.id = c.id_fiche LEFT JOIN
     `goals` g
     ON s.id_membre = g.id_membre LEFT JOIN
     `factures` f
     ON s.id_membre = f.addedfrom AND f.status=2
GROUP BY s.id_membre
jxct1oxe

jxct1oxe2#

你得把你的问题改成-

select CONCAT(s.firstname, ' ', s.lastname) AS Membre,
       g.achievement AS Objectif,
       count(l.assigned) AS `num_l`,
       count(c.id_fiche) AS `num_c`,
       (count(c.id_fiche)/count(l.assigned))*100 AS `perc`,
       SUM(f.total) AS `glob`,
       (g.achievement - SUM(f.total)) AS `rest`,
       (SUM(f.total)/g.achievement)*100 AS `taux`
  from `groups` s
  LEFT JOIN `fiches` l ON s.id_membre=l.assigned
                       AND l.dateassigned BETWEEN  '2020-08-01' AND '2020-08-31'
  LEFT JOIN `clients` c ON l.id=c.id_fiche
  LEFT JOIN `goals` g ON s.id_membre=g.id_membre
  LEFT JOIN `factures` f ON s.id_membre=f.addedfrom
                         AND f.status=2
 GROUP BY s.id_membre
zmeyuzjn

zmeyuzjn3#

您只运行左联接,因此在不知道所有表的情况下,我的第一个直觉是“groups”表中缺少成员本身,即选择的第一个表。或者,尝试删除where和and条件,看看丢失的用户是否会回来。

相关问题