[英]Mysql - Get all specific rows from one table matching criteria and relations if any from other table
[英]How to display all rows from one table if there are no rows with matching criteria to count in second table
我有兩張桌子。 “成員”是所有成員的列表,“統計數據”是工作日期的列表。 共享字段是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
產生了錯誤Warning: mysqli_error() expects exactly 1 parameter, 0 given
。
有人建議使用COALESCE (COUNT(s.memberID),0) as tot_days
但這只會產生與上面相同的錯誤。
我已經在這幾天了,我只是一點點沮喪!
SELECT u.*
, COUNT(DISTINCT s.date) tot_days
FROM members u
LEFT
JOIN stats s
ON s.memberID = u.memberID
GROUP
BY u.memberID
ORDER
BY u.lname
, u.fname
你將不得不重新構建你的查詢
create table members (id int primary key auto_increment, lname varchar(30), fname varchar(30));
insert into members values (1, 'Mertz', 'Fred') ,(2, 'Doe', 'Jane') ,(3, 'Smith', 'Frank'),(4, 'Ricardo', 'Lucy') ,(5, 'Starr', 'Ringo');
create table stats (member_id int, dates date, stat_id int);
insert into stats values (1, '2017-12-31', 1),(3, '2017-12-31', 2),(4, '2017-12-31', 3),(2, '2018-12-31', 4),(4, '2018-12-31', 5),(2, '2019-05-05', 6),(3, '2019-05-05', 7);
mysql> (select
-> m.id,
-> m.fname,
-> count(*) as total_days
-> from
-> members m inner join stats s on m.id = s.member_id
-> group by m.id)
-> union
-> (select
-> m.id,
-> m.fname,
-> 0 as total_days
-> from
-> members m where not exists ( select * from stats s where m.id = s.member_id));
+----+-------+------------+
| id | fname | total_days |
+----+-------+------------+
| 1 | Fred | 1 |
| 3 | Frank | 2 |
| 4 | Lucy | 2 |
| 2 | Jane | 2 |
| 5 | Ringo | 0 |
+----+-------+------------+
5 rows in set (0.00 sec)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.