mysql - 使用 WHERE 选择 LEFT/RIGHT JOIN 并返回 NULL

标签 mysql sql

我需要将以下两个有效 查询转换为一个查询,但所有内容 由于各种原因,我尝试在我身上死去。我的最终结果是尝试列出所有 手头上的软件,并显示为所查询的特定 PC 安装了哪些软件,哪些未安装。对于已安装的软件,列出名称,否则为名称显示 NULL。我已经在 where 子句中尝试了一些子选择语句,这些语句给了我一个没有错误的结果,但不是正确的结果。感谢您的帮助。

qry1

SELECT device_software.sw_id

FROM Software_device LEFT JOIN Device ON Software_device.d_id = Device.d_id

WHERE Device.d_id = 1;

qry2

SELECT Software.name, Software.sw_id, qry1.sw_id

FROM software LEFT JOIN qry1 ON software.sw_id = qry1.sw_id;

设备表

------------------
| name  | d_id  |
------------------
| PC1   | 1     |
| PC2   | 2     |
| PC3   | 3     |
------------------

软件表

------------------
| name  | sw_id |
------------------
| SW_a  | A     |
| SW_b  | B     |
| SW_c  | C     |
| SW_d  | D     |
------------------

Software_Device 表(多对多)

------------------
| d_id  | sw_id |
------------------
| 1     | A     |
| 1     | B     |
| 2     | A     |
| 2     | B     |
| 2     | C     |
------------------

结果我正在寻找... (在 PC1 上安装和卸载软件)

---------------------------------
| Sotfware  | pc_id |   name    |
---------------------------------
| SW_a      | 1     |   PC1     |
| SW_b      | 1     |   PC1     |
| SW_c      | NULL  |   NULL    |
| SW_d      | NULL  |   NULL    |
---------------------------------

我列出了 mysql 和 sql 标签,因为我认为这不重要,但以防万一,我使用的是 mysql。

最佳答案

如果 RomanKonz 的答案肯定很接近,只需将“where”移动到“on”,让左连接适本地工作。

select software.name as Software,
    device.d_id as pc_id,
    device.name as name
from software
    left join device_software
        on device_software.sw_id = software.sw_id
       and **device_software**.d_id = 1
    left join device
        on device_software.d_id = device.d_id
;

关于mysql - 使用 WHERE 选择 LEFT/RIGHT JOIN 并返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12549266/

相关文章:

mysql - 学生出勤表结构

php - 检查 mysql_query 是否返回任何结果的最佳方法?

SELECT/WHERE 中的 python SQL 变量

mysql - 在单个查询中获取数据

sql - 谷歌大查询中行之间的差异

mysql - 备份mysql二进制文件

mysql - 如何在 MySQL 5.5 中执行 IFNULL(count(*),0)

mysql - 以最佳方式插入和删除行

sql - 我可以在 T-SQL 中使用什么来进行无操作?

sql - 在 PostgreSQL 中获取两个日期之间的结果