Как выбрать два столбца из двух разных таблиц с помощью объединения - PullRequest
2 голосов
/ 29 апреля 2019

постановка задачи: - взять записи из двух таблиц, одна - посещаемость, а вторая - посещения конкретного пользователя и между определенными датами

У меня есть две таблицы: одна - посещаемость, вторая - посещения

1) посещаемость

+-------------+------------+---------------------+
| user        | date_today | in_time             |
+-------------+------------+---------------------+
| MCCuser0036 | 25-02-2019 | 25-02-2019 10:59:08 |
| MCCuser0036 | 12-03-2019 | 12-03-2019 10:59:54 |
| MCCuser0036 | 14-03-2019 | 14-03-2019 11:01:11 |
| MCCuser0036 | 25-01-2019 | 25-01-2019 11:02:09 |
| MCCuser0036 | 25-03-2019 | 25-03-2019 11:03:10 |
| MCCuser0035 | 25-03-2019 | 25-03-2019 11:39:38 |
| MCCuser0036 | 26-03-2019 | 26-03-2019 11:30:47 |
| MCCuser0036 | 27-03-2019 | 27-03-2019 10:36:30 |
| MCCuser0036 | 28-03-2019 | 28-03-2019 17:18:01 |
| MCCuser0036 | 01-04-2019 | 01-04-2019 15:29:08 |
| MCCuser0036 | 08-04-2019 | 08-04-2019 23:01:57 |
| MCCuser007  | 26-04-2019 | 26-04-2019 20:04:36 |
| MCCuser0036 | 27-04-2019 | 27-04-2019 21:06:17 |
+-------------+------------+---------------------+

2) посещения

+-------------+------------+---------------------+
| username    | add_time   | visit_time_in       |
+-------------+------------+---------------------+
| MCCuser0036 | 13-02-2019 | 13-02-2019 11:46:55 |
| MCCuser0036 | 14-02-2019 | 14-02-2019 11:47:04 |
| MCCuser0036 | 14-02-2019 | 14-02-2019 11:51:07 |
| MCCuser0036 | 14-02-2019 | 14-02-2019 11:51:30 |
| MCCuser0036 | 14-02-2019 | 14-02-2019 11:51:36 |
| MCCuser0036 | 18-02-2019 | 18-02-2019 15:09:42 |
| MCCuser0036 | 20-02-2019 | 20-02-2019 12:11:30 |
| MCCuser0036 | 25-02-2019 | 25-02-2019 13:05:42 |
| MCCuser0036 | 11-03-2019 | 11-03-2019 12:48:28 |
| MCCuser0036 | 01-04-2019 | 01-04-2019 15:55:45 |
| MCCuser007  | 26-04-2019 | 26-04-2019 20:04:55 |
| MCCuser007  | 26-04-2019 | 26-04-2019 20:05:10 |
| MCCuser0036 | 27-04-2019 | 27-04-2019 21:06:55 |
+-------------+------------+---------------------+

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

мой вывод должен быть как первое посещение, так и все посещения этого пользователя того дня

+----------+------------------------+----------+---------------------+
|user      |in_time                 |username  |visit_time_in        |
+----------+------------------------+----------+---------------------+
|given user|attendence of given date|given user|visits of given user |
+----------+------------------------+----------+---------------------+

Я использую этот запрос, но он дает мне пустой набор и предупреждение, и у меня нет глубоких знаний о mysql и соединениях, поэтому я не знаю, правильно ли я это делаю или нет:

SELECT a.user,a.in_time,v.username,v.visit_time_in 
   FROM attendence AS a 
   INNER JOIN visits AS v ON a.user=v.username 
      WHERE a.user='MCCuser0036' 
      AND a.in_time BETWEEN STR_TO_DATE('01-04-2019', '%d-%m-%Y') 
      AND STR_TO_DATE('27-04-2019', '%d-%m-%Y') 
   ORDER BY a.in_time,v.visit_time_in DESC; 

Empty SET, 22 WARNINGS (0.00 sec) 

примечание: нет первичного и внешнего ключа, а также date_today, in_time и add_time, visit_time_in и обоих столбцов username, varchar

ОБНОВЛЕННОЕ РЕДАКТИРОВАНИЕ ответ @SebastianBrosch - это то, что я хотел, но у меня есть больше столбцов в моей БД, поэтому после получения базовой структуры я добавил в нее несколько столбцов и запросил это

SELECT * FROM (SELECT 'attendence' AS 'type', user AS 'username', STR_TO_DATE(in_time, '%d-%m-%Y %H:%i:%s') AS 'time_in', STR_TO_DATE(out_time, '%d-%m-%Y %H:%i:%s') AS 'time_out', location_in as 'place_in' FROM attendence UNION ALL SELECT 'visit', username, STR_TO_DATE(visit_time_in, '%d-%m-%Y %H:%i:%s'), STR_TO_DATE(visit_time_out, '%d-%m-%Y %H:%i:%s'), in_address FROM visits) t WHERE t.username = 'MCCuser0036' AND time_in BETWEEN STR_TO_DATE('01-01-2019', '%d-%m-%Y %H:%i:%s') AND STR_TO_DATE('27-04-2019', '%d-%m-%Y %H:%i:%s') ORDER BY time_in ASC;

но это дает мне неожиданный результат

+------------+-------------+---------------------+---------------------+----------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| type       | username    | time_in             | time_out            | address_in                                                                                                           | address_out                                                                                         |
+------------+-------------+---------------------+---------------------+----------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| attendence | MCCuser0036 | 2019-01-25 11:02:09 | 2019-01-25 11:02:10 | in_address                                                                                                           | out_address                                                                                         |
| visit      | MCCuser0036 | 2019-02-13 11:46:55 | 2019-02-13 11:47:00 | Sewri - Chembur Rd, Trombay Indusrial Area, Antop Hill, Mumbai, Maharashtra 400037, India                            | Sewri - Chembur Rd, Trombay Indusrial Area, Antop Hill, Mumbai, Maharashtra 400037, India           |
| visit      | MCCuser0036 | 2019-02-14 11:47:04 | 2019-02-14 11:47:10 | Sewri - Chembur Rd, Trombay Indusrial Area, Antop Hill, Mumbai, Maharashtra 400037, India                            | Sewri - Chembur Rd, Trombay Indusrial Area, Antop Hill, Mumbai, Maharashtra 400037, India           |
| visit      | MCCuser0036 | 2019-02-14 11:51:07 | 2019-02-14 11:51:10 | Kokri Agar Road, Koliwada, Kokri Agar, Sion, Mumbai, Maharashtra 400037, India                                       | Kokri Agar Road, Koliwada, Kokri Agar, Sion, Mumbai, Maharashtra 400037, India                      |
| visit      | MCCuser0036 | 2019-02-14 11:51:30 | 2019-02-14 11:51:34 | Kokri Agar Road, Koliwada, Kokri Agar, Sion, Mumbai, Maharashtra 400037, India                                       | Kokri Agar Road, Koliwada, Kokri Agar, Sion, Mumbai, Maharashtra 400037, India                      |
| visit      | MCCuser0036 | 2019-02-14 11:51:36 | 2019-02-14 11:51:39 | Kokri Agar Road, Koliwada, Kokri Agar, Sion, Mumbai, Maharashtra 400037, India                                       | Kokri Agar Road, Koliwada, Kokri Agar, Sion, Mumbai, Maharashtra 400037, India                      |
| visit      | MCCuser0036 | 2019-02-18 15:09:42 | NULL                | Kokri Agar Road, Koliwada, Kokri Agar, Sion, Mumbai, Maharashtra 400037, India                                       |                                                                                                     |
| visit      | MCCuser0036 | 2019-02-20 12:11:30 | 2019-02-20 13:44:36 | Sewri - Chembur Rd, Trombay Indusrial Area, Antop Hill, Mumbai, Maharashtra 400037, India                            | Building No 57, Gaurav Harmony, CGS Colony, Sector 7, Antop Hill, Mumbai, Maharashtra 400037, India |
| attendence | MCCuser0036 | 2019-02-25 10:59:08 | 2019-02-25 10:59:16 | in_address                                                                                                           | out_address                                                                                         |
| visit      | MCCuser0036 | 2019-02-25 13:05:42 | NULL                | Kokri Agar Road, Koliwada, Kokri Agar, Sion, Mumbai, Maharashtra 400037, India                                       |                                                                                                     |
| visit      | MCCuser0036 | 2019-03-11 12:48:28 | NULL                | jay maharashNagar kokri agar S.M road anophill church Near By sayyed alam, musjid, Mumbai, Maharashtra 400037, India |                                                                                                     |
| attendence | MCCuser0036 | 2019-03-12 10:59:54 | 2019-03-12 11:00:24 | in_address                                                                                                           | out_address                                                                                         |
| attendence | MCCuser0036 | 2019-03-14 11:01:11 | 2019-03-14 11:01:28 | in_address                                                                                                           | out_address                                                                                         |
| attendence | MCCuser0036 | 2019-03-25 11:03:10 | 2019-03-25 11:16:12 | in_address                                                                                                           | out_address                                                                                         |
| attendence | MCCuser0036 | 2019-03-26 11:30:47 | NULL                | in_address                                                                                                           | out_address                                                                                         |
| attendence | MCCuser0036 | 2019-03-27 10:36:30 | 2019-03-27 10:49:05 | in_address                                                                                                           | out_address                                                                                         |
| attendence | MCCuser0036 | 2019-03-28 17:18:01 | NULL                | in_address                                                                                                           | out_address                                                                                         |
| attendence | MCCuser0036 | 2019-04-01 15:29:08 | NULL                | in_address                                                                                                           | out_address                                                                                         |
| visit      | MCCuser0036 | 2019-04-01 15:55:45 | NULL                | 736, Aala Hazrat Rd, Jagruti Nagar, Nehru Nagar, Kurla East, Mumbai, Maharashtra 400071, India                       |                                                                                                     |
| attendence | MCCuser0036 | 2019-04-11 15:17:56 | NULL                | in_address                                                                                                           | out_address                                                                                         |
| attendence | MCCuser0036 | 2019-04-23 17:41:05 | 2019-04-23 17:42:54 | in_address                                                                                                           | out_address                                                                                         |
+------------+-------------+---------------------+---------------------+----------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+

Может кто-нибудь указать мне, почему?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Вы также должны использовать STR_TO_DATE в столбце a.in_time, чтобы получить результат:

SELECT a.user, a.in_time, v.username, v.visit_time_in 
FROM attendence AS a INNER JOIN visits AS v ON a.user = v.username 
WHERE a.user = 'MCCuser0036' 
  AND STR_TO_DATE(a.in_time, '%d-%m-%Y') BETWEEN STR_TO_DATE('01-04-2019', '%d-%m-%Y') AND STR_TO_DATE('27-04-2019', '%d-%m-%Y')
ORDER BY STR_TO_DATE(a.in_time, '%d-%m-%Y'), STR_TO_DATE(v.visit_time_in, '%d-%m-%Y') DESC;

Вы не получите результат, потому что условие a.in_time BETWEEN str_to_date('01-04-2019', '%d-%m-%Y') and str_to_date('27-04-2019', '%d-%m-%Y') не может бытьtrue, поскольку a.in_time не является допустимым значением даты.Вы также должны использовать STR_TO_DATE на ORDER BY для сортировки записей по значениям даты.

Примечание: Вы должны использовать тип данных DATETIME для столбцов in_time, visit_time_in и тип данных DATE для add_time и date_today.Таким образом, вы можете фильтровать и сортировать без использования функции преобразования (например, STR_TO_DATE).


Чтобы получить только строки двух таблиц с одним запросом, вы можете использовать UNION ALL, например так:

SELECT type, username, DATE_FORMAT(time_value, '%d-%m-%Y %H:%i:%s') AS 'time_value'
FROM (
    SELECT 'attendence' AS 'type', `user` AS 'username', STR_TO_DATE(in_time, , '%d-%m-%Y') AS 'time_value'
    FROM attendence 
    UNION ALL
    SELECT 'visit', username, STR_TO_DATE(visit_time_in, '%d-%m-%Y')
    FROM visits
) t 
WHERE t.username = 'MCCuser0036'
    AND time_value BETWEEN STR_TO_DATE('01-04-2019', '%d-%m-%Y') AND STR_TO_DATE('27-04-2019', '%d-%m-%Y')
ORDER BY type, time_value DESC
0 голосов
/ 29 апреля 2019
select a.*,v.* from attendence as a
inner join visits as v on a.user = v.username
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...