SQL Присоединиться и получить счет в таблице - PullRequest
0 голосов
/ 28 августа 2018

Вот мой SQL Fiddle

Я сейчас присоединяюсь к user и address таблицам. Теперь мне нужно взять счет таблицы журналов, где заполнены in_time и out_time

Вот мой SQL-запрос, который у меня до сих пор

select u.id, u.name, a.address from user u 
left join address a on u.id = a.user_id
where u.id = 1

Т.е., вывод должен быть таким

id  name    address  total_count proper_count
1   Alpha   Chennai  4           3

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Вы могли бы это:

SELECT u.id, u.name, a.address, 
    COUNT(*) AS total_count,
    SUM(CASE WHEN l.in_time = 0 OR l.out_time = 0 THEN 0 ELSE 1 END) AS proper_count
FROM USER u 
LEFT JOIN address a 
ON u.id = a.user_id
LEFT JOIN log l 
ON u.id = l.user_id
WHERE u.id = 1
GROUP BY u.id, u.name, a.address; 
0 голосов
/ 28 августа 2018

Вы были всего лишь на шаг назад от ожидаемого запроса. просто нужно еще одно соединение с таблицей журналов и использовать агрегатную функцию

select u.id, u.name, a.address,
sum(case when in_time is not null and out_time is not null 
    then 1 else 0 end ) as total_count ,
    SUM(CASE WHEN l.in_time = 0 OR l.out_time = 0 THEN 0 ELSE 1 END) AS proper_count
from user u 
left join address a on u.id = a.user_id
left join log l on u.id=l.user_id
where u.id = 1
group by u.id, u.name, a.address

http://sqlfiddle.com/#!9/b2efe0/6

id  name    address total_count proper_count
1   Alpha   Chennai   4            3
0 голосов
/ 28 августа 2018

Используйте ниже дизайн схемы для вашего требования. User_id должен быть INTEGER и использовать тип данных datetime для столбца времени входа и выхода.

CREATE TABLE log (
    id BIGINT,
    user_id BIGINT,
    in_time datetime,
    out_time datetime
);

INSERT INTO log (id,user_id, in_time, out_time) VALUES (1,1,'2018-07-21 06:50:41','2018-07-21 10:50:41');
INSERT INTO log (id,user_id, in_time, out_time) VALUES (2,1,'2018-07-22 06:50:41','2018-07-22 10:50:41');
INSERT INTO log (id,user_id, in_time) VALUES (3,1,'2018-07-23 06:50:41');
INSERT INTO log (id,user_id, in_time, out_time) VALUES (4,1,'2018-07-24 06:50:41','2018-07-22 10:50:41');

select u.id as user_id, u.name, a.address, COUNT(in_time) AS total_count, COUNT(out_time) as proper_count
from log l
INNER JOIN user u on u.id = l.user_id
INNER JOIN address a on a.user_id = u.id
GROUP BY u.id , u.name, a.address
...