我今天大部分时间都在忙这个,为了“有所收获”,今天我开始将查询分成多个 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/