【发布时间】:2019-05-21 22:42:56
【问题描述】:
我有两张桌子。 “members”是所有成员的列表,“stats”是工作日期的列表。共享字段是 memberID。我需要每个人工作天数的 COUNT 个,并且我希望每个人都列在输出表中,即使他们还没有工作日。
简化的数据库结构是:
**members** **stats**
memberID lname fname memberID date statsID
1 Mertz Fred 1 2017-12-31 1
2 Doe Jane 3 2017-12-31 2
3 Smith Frank 4 2017-12-31 3
4 Ricardo Lucy 2 2018-12-31 4
5 Starr Ringo 4 2018-12-31 5
2 2019-05-05 6
3 2019-05-05 7
所需的输出是:
memberID lname fname Total Days
2 Doe Jane 2
1 Mertz Fred 1
4 Ricardo Lucy 2
3 Smith Frank 2
5 Starr Ringo 0 OR blank
Ringo 任何天都没有工作,也没有出现在输出表上。
我的代码是:
$sql = "SELECT u.*,
COUNT(s.memberID)as tot_days
FROM members u
LEFT JOIN stats s
ON s.memberID = u.memberID
GROUP BY s.memberID
ORDER BY lname,fname";
$members = mysqli_query($dbc,$sql) or die(mysqli_error());
while ($row = mysqli_fetch_array($members)){
$row = array_map('htmlspecialchars', $row);
echo <<< HTML etc.
除了包括那些还没有工作一天的成员之外,我希望它可以做所有事情。 JOIN、LEFT JOIN、LEFT OUTER JOIN、RIGHT JOIN、RIGHT OUTER JOIN 都产生相同的结果。我尝试了 LEFT 和 RIGHT INNER JOIN,如果它们甚至存在,则会产生错误Warning: mysqli_error() expects exactly 1 parameter, 0 given。
有人建议使用COALESCE (COUNT(s.memberID),0) as tot_days,但这只会产生与上述相同的错误。
我已经为此工作了好几天,现在有点沮丧!
【问题讨论】:
-
所以给mysqli_error()它想要的参数
mysqli_error($dbc),看看错误是什么。可能与聚合使用不正确有关(SELECT之后列出的列既不是聚合函数的参数,也不是在GROUP BY中列出)。 -
Miken32 的解决方案确实有效。它选择了几个没有工作日期的新成员之一。我的样本应该包含不止一个。我试图在他的帖子中添加评论,但它不允许我。
-
按 u.memberid 分组
-
这是您的原始查询还是已被编辑?因为它确实根据您的预期输出返回。