MySQL JOIN 2 Подзапросы, которые зависят от 1-го подзапроса - PullRequest
0 голосов
/ 21 июня 2019

Я был на этом большую часть дня и, пытаясь «добраться куда-то» сегодня, я начал разбивать запросы на куски, чтобы я мог соединить их, так сказать.У меня есть 1-й запрос, чтобы работать так, как мне нужно (используя объединение и подзапрос) Мне просто нужно разобраться, как сделать аналогичную вещь, чтобы включить результат 2-го запроса в столбец в запросе 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 |
+----+-------+--------+-----------+

Результат (storeID)из Query2 должен находиться в столбце в Query 1 Query 2 необходимо значение из d.vehicleID для работы.Я знаю, что не могу быть так далеко, и я играю с подзапросами, однако, я просто могу, кажется, собрать это вместе!Я должен также упомянуть, что запрос может возвращать НЕДЕЙСТВИТЕЛЬНЫЙ результат, это нормально, поэтому должно быть ЛЕВОЕ Соединение (?)

РЕДАКТИРОВАТЬ 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'

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Ваша проблема здесь:

 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

Вы используете псевдоним "d.vehicleID", который находится снаружи в подзапросе:

WHERE a.module = 1 AND b.referance = d.vehicleID

0 голосов
/ 21 июня 2019

Просто удалите условие WHERE AND b.referance = d.vehicleID, которое является избыточным, поскольку оно обрабатывается в JOIN пункте ON s.vehicleID = d.vehicleID.Обратите внимание, что у вас псевдоним b.reference как s.vechicleID .


Кстати, если вы используете MySQL 8+, рассмотрите CTEs для удобочитаемости, которая превращает ваш первый подзапрос в объединение по совокупному запросу.WITH при таком подходе все упоминается как именованные источники верхнего уровня без вложенных 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
...