SQL查询必须返回所有数据,而不仅仅是现有数据

时间:2018-04-12 18:18:21

标签: mysql sql select join

我不是查询大师,所以我需要一些帮助...... 我得到以下查询:

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            |
---------------

基本上我想要的是显示用户的每个设备,无论该用户是否在该设备上有利润,我在考虑在同一个桌面上加入,这是否可能以某种方式?< / p>

修改

'user'表如下所示:

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

'device'表格如下:

-------------------------------
|user_id | device_id | profit |
-------------------------------

3 个答案:

答案 0 :(得分: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,则必须是设备表中2个过滤器中的1个将其排除。

答案 1 :(得分: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'

答案 2 :(得分: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设备ID。因此,如果列分配正确,那么这个更简单的查询将起作用:

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;