MySQL JOIN 2 依赖于第一个子查询的子查询

标签 mysql sql subquery left-join

我今天大部分时间都在忙这个,为了“有所收获”,今天我开始将查询分成多个 block ,这样我就可以将它们粘在一起。我已经有了第一个查询,可以根据需要运行(使用联接和子查询),我只需要弄清楚如何执行类似的操作,将第二个查询的结果包含到查询 1 的列中

查询1:

SELECT
u.user_id,
u.firstname,
u.surname,
d.vehicleID,
vehicle.REG
FROM
users AS u
LEFT JOIN vehicle_drivers AS d ON u.user_id = d.driverID AND d.`timestamp` = (SELECT MAX(d2.`timestamp`)
                         FROM vehicle_drivers d2
                         WHERE d2.driverID = u.user_id
                        )
LEFT JOIN vehicle ON d.vehicleID = vehicle.ID
WHERE
    u.hide <> 1
AND remote_logon = 1

然后我需要查询 2 的结果:

SELECT
    a.referance AS storeID,
FROM
    qrTag_linktable a
INNER JOIN qrTag_linktable AS b ON b.tagID = a.tagID WHERE a.module = 1 and  b.referance = ****d.vehicleID****

这是 qrTag_linktable

+----+-------+--------+-----------+
| ID | tagID | module | referance |
+----+-------+--------+-----------+
|  3 |     1 |      1 |         1 |
|  8 |     1 |      2 |        67 |
|  9 |    11 |      1 |         4 |
| 10 |    11 |      2 |        77 |
+----+-------+--------+-----------+

查询 2 的结果 (storeID) 需要位于查询 1 的列中,查询 2 需要 d.vehicleID 的值才能工作。我知道我不可能离得那么远,而且我一直在玩子查询,但是我似乎可以把它放在一起!我还应该提到查询一可能返回 NULL 结果,这是可以的,因此需要是 LEFT Join (?)

编辑2: 以下是所需结果的示例:

+---------+-----------+---------+-----------+---------+----------+
| user_id | firstname | surname | vehicleID | storeID |   REG    |
+---------+-----------+---------+-----------+---------+----------+
|       2 | Steve     | Jobs    |        67 |       1 | VN64 *** |
|     653 | James     | Smith   |        77 |       4 | *** EUF  |
|     592 | Harry     | Potter  |        72 |         | YM64 *** |
+---------+-----------+---------+-----------+---------+----------+

编辑: 这是我到目前为止的工作:S

SELECT
    u.user_id,
    u.firstname,
    u.surname,
    d.vehicleID,
    s.storeID,
    vehicle.REG
FROM
    users AS u
LEFT JOIN vehicle_drivers AS d ON u.user_id = d.driverID
AND d.`timestamp` = (
    SELECT
        MAX(d2.`timestamp`)
    FROM
        vehicle_drivers d2
    WHERE
        d2.driverID = u.user_id
)
LEFT JOIN vehicle ON d.vehicleID = vehicle.ID
LEFT JOIN (
    SELECT
        a.referance AS storeID,
        b.referance AS vehicleID
    FROM
        qrTag_linktable a
    INNER JOIN qrTag_linktable AS b ON b.tagID = a.tagID
    WHERE
        a.module = 1
    AND b.referance = d.vehicleID
) AS s ON s.vehicleID = d.vehicleID
WHERE
    u.hide <> 1
AND remote_logon = 1
[Err] 1054 - Unknown column 'd.vehicleID' in 'where clause'

最佳答案

只需删除 WHERE 条件 AND b.referance = d.vehicleID ,该条件是多余的,因为它是在 JOIN 子句中处理的 ON s.vehicleID = d.vehicleID。请注意,您将 b.reference 别名为 s.vechicleID

<小时/>

顺便说一句,如果使用 MySQL 8+,请考虑 CTEs为了提高可读性,它将您的第一个子查询转换为聚合查询的联接。 使用这种方法,所有内容都被引用为顶级命名源,而无需嵌套SELECT语句。

WITH max_time AS (
    SELECT driverID,
           MAX(d2.`timestamp`) AS max_time
    FROM vehicle_drivers
    GROUP BY driverID
), 
    tag_link AS (
    SELECT a.referance AS storeID,
           b.referance AS vehicleID
    FROM qrTag_linktable a
    INNER JOIN qrTag_linktable AS b 
        ON b.tagID = a.tagID
    WHERE a.module = 1
)

SELECT
    u.user_id,
    u.firstname,
    u.surname,
    d.vehicleID,
    s.storeID,
    v.REG
FROM users AS u
LEFT JOIN vehicle_drivers AS d 
    ON u.user_id = d.driverID
LEFT JOIN max_time AS m 
    ON u.user_id = m.driverID 
    AND d.`timestamp` = m.max_time
LEFT JOIN vehicle v 
    ON d.vehicleID = v.ID
LEFT JOIN tag_link s 
    ON s.vehicleID = d.vehicleID
WHERE u.hide <> 1
AND remote_logon = 1

关于MySQL JOIN 2 依赖于第一个子查询的子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56706187/

相关文章:

php - SQL 显示与客户端 ID 匹配的所有结果,但仅显示每个实例的最新版本

php - Strato 服务器上的字符集

php - MYSQL 选择最接近给定日期但不更早的最旧记录

mysql - 如何绕过子查询中对外部表的引用?

sql - SQL-选择随机行并合并到新表中

php - 选择我没有的数据库项目

mysql - 需要将 2 个查询合并为 1 个

Java & MySQL - 创建登录认证

sql - 更改序列以链接到另一个表

mysql - 按某些列混合 `select`查询结果