mysql 使用外部别名进行 2 级深度子查询

标签 mysql sql

我目前被困在这里,不知道下一步该做什么,因为我无法在 2 级深度子查询中使用 tv_main 别名。这是我的代码(我评论了有问题的部分)。任何帮助将不胜感激。谢谢。

SELECT tv_main.id,
    tv_main.vesselName,
    (
        SELECT  SUM(t_statCtr.status = 'EX CREW')
        FROM
        (
                (
                    SELECT  tpi_stat.id,
                            tvv.vesselName,
                            lastname, 
                            firstname, 
                            middlename, 
                            IF(tpi_stat.returningCrew = 1, 'NEW HIRE', 
                                IF(COUNT(tc_ctr.personnel_id) > 1, 'EX CREW', 'NEW HIRE')
                              ) 
                            AS status
                    FROM tbl_contracts AS tc_stat
                    LEFT JOIN tbl_personnel_info AS tpi_stat
                    ON tpi_stat.id = tc_stat.personnel_id 

                    LEFT JOIN tbl_contracts AS tc_ctr
                    ON tpi_stat.id = tc_ctr.personnel_id

                    LEFT JOIN tbl_vessels AS tvv
                    ON tvv.id = tpi_stat.lastJoinedVsl

                    WHERE
                            tpi_stat.emp_status = 'ON-BOARD'
                            AND tc_stat.status = 'ACTIVE'
                            AND tvv.id = tv_main.id --This line have an error, (Unknown Column tv_main.id in where clause)
                            GROUP BY tc_stat.personnel_id
                ) AS t_statCtr
        )
    ) AS ex_crew,
    NULL AS new_hire
    FROM tbl_vessels AS tv_main -- I need this one to use inside the subquery
    LEFT JOIN tbl_personnel_info AS tpi
    ON tv_main.id = tpi.lastJoinedVsl

    LEFT JOIN tbl_contracts AS tc
    ON tpi.id = tc.personnel_id 
    WHERE
    tpi_stat.emp_status = 'ON-BOARD'
    AND tc_stat.status = 'ACTIVE'
    GROUP BY tv_main.vesselName

最佳答案

终于解决了。我不知道mysql只允许1层深度的关联。

SELECT  tv_main.vesselName,
    SUM(t_dummy.statusx = 'EX CREW') AS ex_crew,
    SUM(t_dummy.statusx = 'NEW HIRE') AS new_hire
FROM tbl_vessels AS tv_main

LEFT JOIN tbl_personnel_info AS tpi_main 
ON tpi_main.lastJoinedVsl = tv_main.id

LEFT JOIN tbl_contracts AS tc_main
ON tc_main.personnel_id = tpi_main.id

 LEFT JOIN
(
    SELECT  tvv.id,
            tpi_stat.id AS tpiid,
            IF(tpi_stat.returningCrew = 1, 'NEW HIRE', 
                IF(COUNT(tc_ctr.personnel_id) > 1, 'EX CREW', 'NEW HIRE')
                ) 
            AS statusx
    FROM tbl_contracts AS tc_stat
    LEFT JOIN tbl_personnel_info AS tpi_stat
    ON tpi_stat.id = tc_stat.personnel_id 

    LEFT JOIN tbl_contracts AS tc_ctr
    ON tpi_stat.id = tc_ctr.personnel_id

    LEFT JOIN tbl_vessels AS tvv
    ON tvv.id = tpi_stat.lastJoinedVsl
    GROUP BY tc_stat.personnel_id  
) AS t_dummy
ON tpi_main.id = t_dummy.tpiid 
WHERE
tpi_main.emp_status = 'ON-BOARD'
AND tc_main.status = 'ACTIVE'
AND t_dummy.id = tv_main.id
GROUP BY tv_main.vesselName;

关于mysql 使用外部别名进行 2 级深度子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42286953/

相关文章:

mysql - 如何使用 WordPress 进行自定义查询?

php - 如何显示从 Blade 到 Blade 选择的日期?

php - 使用 ajax 调用时,MySQL 查询数组不会被填充

MySQL WHERE 子句中的多个表

sql - 使用单数据库多架构的 ASP.NET MVC Multi-Tenancy 应用程序 : Calling Store Procedures from the application tries to access dbo tables

php - 如何使用连接列导出到 csv

mysql - 如何加快多重内连接查询的速度?

sql - SQL 中的 CHAR 数据类型是否已过时?你什么时候使用它?

sql - SQL中有固定的除法吗?

sql - 为什么 Clng 在这些场景中的工作方式不同,并且可以在 SQL Server 中重现吗? (不是银行家四舍五入)