Php mysql-如何将主查询值传递到子查询中的联接

Php mysql-如何将主查询值传递到子查询中的联接,php,mysql,sql,subquery,visibility,Php,Mysql,Sql,Subquery,Visibility,我有以下的疑问以及。。。让我讨厌的部分是: SELECT DISTINCT `serv`.`id`, `serv`.`name`, `prj`.`id` AS `idProject`, `prj`.`name` AS `projectName`, `units`.`id` AS `idUnit`, `units`.`name` AS `unitName`, `units`.`description` AS `unitDescription`, `units`.`descriptionLo

我有以下的疑问以及。。。让我讨厌的部分是:

SELECT DISTINCT `serv`.`id`, `serv`.`name`, `prj`.`id` AS `idProject`, `prj`.`name` AS `projectName`, `units`.`id` AS `idUnit`,
    `units`.`name` AS `unitName`, `units`.`description` AS `unitDescription`, `units`.`descriptionLong` AS `unitLongDescription`,
    `units`.`address`, `units`.`telephone`, (
        SELECT DISTINCT GROUP_CONCAT(CONCAT(`subserv`.`id`, '|', `subserv`.`name`, '|', `links`.`continuous`))
        FROM `" . DBT_SERV . "` AS `subserv`
        JOIN `" . DBT_SERV_LINKS . "` AS `links` ON (
            `links`.`deleted` = 0 AND
            `links`.`idProject` = `serv`.`idProject` AND
            `links`.`mandatory` = '1' AND
            `links`.`subserviceLink` = 1 AND
            `links`.`serviceFrom` LIKE CONCAT ('|', `serv`.`id`,'|') AND
            `links`.`serviceTo` LIKE CONCAT('|', `subserv`.`id`, '|')
        )
        WHERE `idParentService` = `serv`.`id`
            AND `subserv`.`deleted` = 0
            AND `subserv`.`onSaleStatus` = 'onSale'
            AND `subserv`.`serviceGroup` = 'SS'
    ) AS `subservices`, (
        SELECT `file`
        FROM `" . DBT_GALLERY . "` AS `gallery`
        WHERE `gallery`.`category` = 'accommodationUnit'
            AND `idObject` = `idUnit`
        LIMIT 1
    ) AS `picture`
FROM `" . DBT_SERV . "` AS `serv`
等等,等等。。。更多的连接和一个where

我的问题是,我得到了以下错误:“on子句”中的1054-未知列“serv.idProject”

如果我删除links.idProject=serv.idProject,并在“on子句”中得到1054-未知列“serv.id=”


基本上。。。在ON子句中,我看不到serv的任何内容。如果我删除整个连接查询,那么在WHERE子句中serv是可见的。您知道如何使其在ON子句中也起作用吗?

在内部select中,您仅连接subserv和links,因此无法在ON中使用其他表。您应该能够访问WHERE子句中的外部表,但是:

... (
SELECT DISTINCT GROUP_CONCAT(CONCAT(`subserv`.`id`, '|', `subserv`.`name`, '|', `links`.`continuous`))
                FROM `" . DBT_SERV . "` AS `subserv`
                JOIN `" . DBT_SERV_LINKS . "` AS `links` ON (
                    `links`.`deleted` = 0 AND
                    `links`.`mandatory` = '1' AND
                    `links`.`subserviceLink` = 1 AND
                    `links`.`serviceTo` LIKE CONCAT('|', `subserv`.`id`, '|')
                WHERE `links`.`idProject` = `serv`.`idProject` AND
                      `links`.`serviceFrom` LIKE CONCAT ('|', `serv`.`id`,'|') 
                )
...
应该适用于内部子选择。

试试这个

SELECT DISTINCT `serv`.`SID`, `serv`.`SNAME`, `serv`.`SIDP`, `prj`.`id` AS `idProject`,
`prj`.`name` AS `projectName`, `units`.`id` AS `idUnit`,
`units`.`name` AS `unitName`, `units`.`description` AS `unitDescription`,
`units`.`descriptionLong` AS `unitLongDescription`, `units`.`address`, 
`units`.`telephone`,
    (
        SELECT DISTINCT GROUP_CONCAT(CONCAT(`subserv`.`id`, '|', `subserv`.`name`, '|', `links`.`continuous`))
        FROM `" . DBT_SERV . "` AS `subserv`
        JOIN `" . DBT_SERV_LINKS . "` AS `links` ON (
            `links`.`deleted` = 0 AND
            `links`.`idProject` = `serv`.`SIDP` AND
            `links`.`mandatory` = '1' AND
            `links`.`subserviceLink` = 1 AND
            `links`.`serviceFrom` LIKE CONCAT ('|', `serv`.`SID`,'|') AND
            `links`.`serviceTo` LIKE CONCAT('|', `subserv`.`id`, '|')
        )
        WHERE `idParentService` = `serv`.`SID`
            AND `subserv`.`deleted` = 0
            AND `subserv`.`onSaleStatus` = 'onSale'
            AND `subserv`.`serviceGroup` = 'SS'
    ) AS `subservices`, (
        SELECT `file`
        FROM `" . DBT_GALLERY . "` AS `gallery`
        WHERE `gallery`.`category` = 'accommodationUnit'
            AND `idObject` = `idUnit`
        LIMIT 1
    ) AS `picture`
FROM 
    (SELECT `id` AS `SID`, `idProject` AS `SIDP`, `name` AS `SNAME` FROM `" . DBT_SERV . "`) AS serv
ETC., ETC... some more joins and a where.
SID、SNAME和SIDP别名是在主体查询中定义的,因此应该可以访问子查询

在子查询编译期间,别名SERV不存在 因为只有在子查询完成后才能编译外部查询 被认为有效且其输出已知

因此,快速解决方案就是在子查询中用DBT_serv替换serv


您能在这里插入结果命令SHOW CREATE tbl_name为您在查询中使用的所有表创建tbl_name吗?我在医院住了2天,无法从这里访问。。。在这之后,我会很高兴。你在第一行写:prj.id作为idProject,所以idProject来自表prj而不是serv,或者我遗漏了什么?…你能提供一个例子吗你正在做一个常规的内部联接,您是否尝试将这些条件放在WHERE子句而不是ON子句中?@Igoel idProject是表projects中project id列id的别名,是服务表中的列。也许不是化名的最佳选择,谢谢你指出。是的,但我仍然在寻找一个更一般的答案+1@zozo从哪个意义上讲,你的意思是更一般?JOIN是一个带有local ON子句的本地操作,它只能访问JOIN中提到的表。要从subselect访问外部的表,必须使用WHERE。
SELECT DISTINCT `serv`.`id`, `serv`.`name`, `prj`.`id` AS `idProject`, `prj`.`name` AS `projectName`, `units`.`id` AS `idUnit`,
    `units`.`name` AS `unitName`, `units`.`description` AS `unitDescription`, `units`.`descriptionLong` AS `unitLongDescription`,
    `units`.`address`, `units`.`telephone`, (
        SELECT DISTINCT GROUP_CONCAT(CONCAT(`subserv`.`id`, '|', `subserv`.`name`, '|', `links`.`continuous`))
        FROM `" . DBT_SERV . "` AS `subserv`
        JOIN `" . DBT_SERV_LINKS . "` AS `links` ON (
            `links`.`deleted` = 0 AND
            `links`.`idProject` = `" . DBT_SERV . "`.`idProject` AND
            `links`.`mandatory` = '1' AND
            `links`.`subserviceLink` = 1 AND
            `links`.`serviceFrom` LIKE CONCAT ('|', `" . DBT_SERV . "`.`id`,'|') AND
            `links`.`serviceTo` LIKE CONCAT('|', `subserv`.`id`, '|')
        )
        WHERE `idParentService` = `" . DBT_SERV . "`.`id`
            AND `subserv`.`deleted` = 0
            AND `subserv`.`onSaleStatus` = 'onSale'
            AND `subserv`.`serviceGroup` = 'SS'
    ) AS `subservices`, (
        SELECT `file`
        FROM `" . DBT_GALLERY . "` AS `gallery`
        WHERE `gallery`.`category` = 'accommodationUnit'
            AND `idObject` = `idUnit`
        LIMIT 1
    ) AS `picture`
FROM `" . DBT_SERV . "` AS `serv`