Как отобразить все строки из одной таблицы, если во второй таблице нет строк с соответствующими критериями для подсчета - PullRequest
0 голосов
/ 22 мая 2019

У меня есть две таблицы.«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

Ринго еще не работал ни одного дня и НЕ появляется в таблице вывода.

Мой код:

$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 дают одинаковый результат.Я пробовал ВЛЕВО и ВПРАВО ВНУТРЕННЕЕ СОЕДИНЕНИЕ, если они вообще существуют, что приводило к ошибке Warning: mysqli_error() expects exactly 1 parameter, 0 given.

Кто-то предложил использовать COALESCE (COUNT(s.memberID),0) as tot_days, но это выдает ту же ошибку, что и выше.

Я занимался этим уже несколько дней, и меня это немного раздражает!

Ответы [ 2 ]

1 голос
/ 22 мая 2019
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
0 голосов
/ 22 мая 2019

вам придется перефразировать ваш запрос

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...