SQL-запрос должен возвращать все данные, а не только существующие данные

0

Я не мастер в запросах, поэтому мне нужна помощь... У меня есть следующий запрос:

SELECT u.id, device_id, profit
  FROM device d
  JOIN user u ON d.user_id = u.id 
  WHERE day = '2017-12-20' and u.id= '22'

Теперь это возвращает

--------------------------------------------------
| u.id| device_id   |profit                      |
--------------------------------------------------
| 22  |1            |200                         |
--------------------------------------------------
| 22  |2            |600                         |
-------------------------------------------------
| 22  |4            |400                         |
--------------------------------------------------
| 22  |5            |650                         |
--------------------------------------------------

Как вы можете видеть, отсутствует device_id (3), я хочу, чтобы результат был таким:

--------------------------------------------------
| u.id| device_id   |profit                      |
--------------------------------------------------
| 22  |1            |200                         |
--------------------------------------------------
| 22  |2            |600                         |
-------------------------------------------------
| 22  |3            |0 (or null)                 |
-------------------------------------------------
| 22  |4            |400                         |
--------------------------------------------------
| 22  |5            |650                         |
--------------------------------------------------

Причина, когда я запускаю

SELECT DISTINCT device_id
FROM device

я получил

---------------
|device_id    |
---------------
|1            |
---------------
|2            |
---------------
|3            |
---------------
|4            |
---------------
|5            |
---------------

И в основном я хочу отображать каждое устройство на пользователе, независимо от того, имеет ли этот пользователь прибыль на этом устройстве или нет, я думал о JOIN на одной и той же таблице, возможно ли это в какой-то мере?

РЕДАКТИРОВАТЬ

Таблица "user" выглядит так:

------------
|id | name |
------------

И таблица "device" выглядит так:

-------------------------------
|user_id | device_id | profit |
-------------------------------
  • 0
    Где хранится day ?
  • 0
    day также сохраняется в таблице device
Показать ещё 1 комментарий
Теги:
select
join

3 ответа

1

Это должно работать:

SELECT u.id, device_id, profit
FROM device d
LEFT JOIN user u ON d.user_id = u.id 
WHERE d.day = '2017-12-20' and d.user_id = '22'

Если это не возвращает 3 то должно быть, что 1 из 2 фильтров в таблице устройства исключает его.

  • 0
    Вы правы, в моем случае это решение не работает, потому что устройство 3 не существует на пользователя с идентификатором 22 , но я все еще хочу попробовать включить устройство 3 без какой-либо прибыли (прибыль = ноль или 0)
0

Это работа для LEFT JOIN вместо JOIN. Вы, наверное, хотите...

SELECT u.id, device_id, profit
  FROM user u
  LEFT JOIN device d ON d.user_id = u.id 
 WHERE day = '2017-12-20' and u.id= '22'

или, может быть

SELECT u.id, device_id, profit
  FROM device d
 RIGHT JOIN user u ON d.user_id = u.id 
 WHERE day = '2017-12-20' and u.id= '22'
  • 0
    К сожалению, не работает ... Я думаю, проблема в том, что у меня есть 5 устройств, но когда я оставляю соединение, я получаю только те устройства, с которых пользователь получает какую-либо прибыль (не устройство с идентификатором 3).
0

Хммм. Я думаю, вы хотите:

SELECT u.id, d.device_id, d.profit
FROM user u LEFT JOIN
     device d
     ON d.user_id = u.id AND d.day = '2017-12-20'
WHERE u.id = 22;

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

РЕДАКТИРОВАТЬ:

Вышеупомянутое вернет идентификаторы NULL. Итак, если назначения столбцов верны, тогда этот более простой запрос будет работать:

SELECT 22 as id, d.device_id,
       (CASE WHEN d.user_id = 22 AND d.day = '2017-12-20' THEN d.profit END) as profit
FROM device d;
  • 0
    Как и выше, левое соединение по-прежнему возвращает только те устройства, с которых пользователь получает прибыль, есть ли способ включить последнее? Я также добавил свою структуру таблицы к вопросу, если вы хотите взглянуть на это
  • 0
    @peaceduck. , , Вы пробовали второй запрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню